在Ruby中的BigDecimal中使用String还是Integer



参考BigDecimal类的文档,

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

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

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

我不明白为什么当传递String时,与传递Fixnum时相比,最大有效位数更少。

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

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

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

最新更新