是否在Ruby中的BigDecimal中使用String或Integer

时间:2015-12-18 04:06:14

标签: ruby precision floating-accuracy

参考BigDecimal类的文档,

  

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

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

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

我无法弄清楚为什么在传递String时,与传递Fixnum时相比,最大有效位数会减少。

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

1 个答案:

答案 0 :(得分:3)

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

在任何情况下,您都不应该担心精度损失 - 有效数字属性更像是提示而不是绝对值。甚至文档都提到它: The actual number of significant digits used in computation is usually larger than the specified number.