我正面临浮动不准确性:
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
。
最重要的解决浮动不精确问题的方法是什么?有更好的解决方案吗?
答案 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)