在 Ruby 的 BigDecimal 中使用 String 还是 Integer

Whether to use String or Integer in BigDecimal in Ruby

提问人:abhinavmsra 提问时间:12/18/2015 最后编辑:abhinavmsra 更新时间:12/18/2015 访问量:566

问:

参考类的文档,BigDecimal

n,m = a.precs
prec返回有效位数 () 和 的最大有效位数 () 。nma

我对以下与 相关的输出感到困惑。BigDecimal

require 'bigdecimal'    
BigDecimal.new('1').precs # => [9, 18] 
BigDecimal.new(1).precs   # => [9, 27]

我无法弄清楚为什么当 a 被传递时,与通过 a 时相比,最大有效位数更少。StringFixnum

它还会导致任何精度问题吗?

Ruby Precision 浮动精度

评论

0赞 mu is too short 12/18/2015
例如,如果你想要一致性,构造函数确实会接受第二个参数。文档确实说,如果您自己不指定,“有效位数是由初始值确定的”。BigDecimal.new('1', 27).precs
0赞 abhinavmsra 12/18/2015
@muistooshort您有权指定这一点。但我的问题是,为什么一开始就不同?precs
3赞 Cary Swoveland 12/18/2015
这里有更多数据点。以下观察结果是指仅包含字符的字符串(例如,),以及数字均为“”的数字(例如,)。如果少于字符数,则返回。如果少于数字,则返回。返回 between 和 字符或数字(即,字符串和数字返回相同的元组),返回 between 和更多数量的字符数字。旁白:我建议你添加到你的代码中。1"111111"111111110[9,18]10[9,27]1018[18,27]19[27,36]require 'bigdecimal'
0赞 abhinavmsra 12/18/2015
@CarySwoveland,感谢您的发现。

答:

4赞 eugen 12/18/2015 #1

如果你能读懂 C 代码,你就可以从 https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2509 开始——这是任何对象的初始值设定项。如果按照该代码执行下一个方法(即BigDecimal_new),您会注意到,在传递整数参数时,与传递字符串参数相比,在分配和创建内部大十进制对象之前还需要执行几个步骤。BigDecimal

在任何情况下,您都不必担心精度损失 - 有效数字属性更像是提示而不是绝对值。甚至文档也提到了这一点:计算中使用的实际有效位数通常大于指定数字。