提问人:abhinavmsra 提问时间:12/18/2015 最后编辑:abhinavmsra 更新时间:12/18/2015 访问量:566
在 Ruby 的 BigDecimal 中使用 String 还是 Integer
Whether to use String or Integer in BigDecimal in Ruby
问:
参考类的文档,BigDecimal
n,m = a.precs
prec
返回有效位数 () 和 的最大有效位数 () 。n
m
a
我对以下与 相关的输出感到困惑。BigDecimal
require 'bigdecimal'
BigDecimal.new('1').precs # => [9, 18]
BigDecimal.new(1).precs # => [9, 27]
我无法弄清楚为什么当 a 被传递时,与通过 a 时相比,最大有效位数更少。String
Fixnum
它还会导致任何精度问题吗?
答:
4赞
eugen
12/18/2015
#1
如果你能读懂 C 代码,你就可以从 https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2509 开始——这是任何对象的初始值设定项。如果按照该代码执行下一个方法(即BigDecimal_new),您会注意到,在传递整数参数时,与传递字符串参数相比,在分配和创建内部大十进制对象之前还需要执行几个步骤。BigDecimal
在任何情况下,您都不必担心精度损失 - 有效数字属性更像是提示而不是绝对值。甚至文档也提到了这一点:计算中使用的实际有效位数通常大于指定数字。
评论
BigDecimal.new('1', 27).precs
precs
1
"111111"
1
111111
10
[9,18]
10
[9,27]
10
18
[18,27]
19
[27,36]
require 'bigdecimal'