浮动不精确度的最佳解决方案

时间:2019-02-07 10:04:45

标签: ruby floating-point precision

我正面临浮动不准确性:

3.84 + 2.53 #=> 6.369999999999999

考虑到数字可以为nil,我可以想到以下解决上述问题的方法。

(num1.to_f + num2.to_f).round(2)

其中使用to_f处理nil。或者,

num1.to_d + num2.to_d

BigDecimal.new(num1.to_s) + BigDecimal.new(nums2.to_s)

在使用to_s的地方处理nil

最重要的解决浮动不精确问题的方法是什么?有更好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

只要您留在有理土地上,有理数就与整数一样精确:

3.84r + 2.53r
# => (637/100)

很显然,不合理的操作会把您踢出困境:

Math.sqrt(4r)
# => 2.0

编辑:如果您已经从浮动开始了……就不那么漂亮了

3.84.to_r
# => (1080863910568919/281474976710656)

因此遍历字符串表示可能会更好(编辑:或更好,请使用漂亮的#rationalize方法):

3.84.to_s.to_r
# => (96/25)

3.84.rationalize
# => (96/25)