abh*_*sra 8 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]
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么当a String传递时,与传递a 相比,最大有效位数会减少Fixnum.
它还会导致任何精度问题吗?
如果您可以阅读 C 代码,则可以从https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2509开始- 这是任何对象的初始化程序BigDecimal。如果您按照该代码执行下一个方法(即BigDecimal_new),您会注意到,与传递字符串参数时相比,在传递整数参数时,在分配和创建内部大十进制对象之前需要执行更多步骤。
在任何情况下,您都不应该担心精度损失 - 有效数字属性更像是提示而不是绝对值。甚至文档也提到了这一点: 计算中使用的实际有效位数通常大于指定的数字。