1.824999999999999.round(2)
# => 1.82
1.82499999999999999.round(2)
# => 1.83
我不明白为什么第一种情况下的结果是1.82
而后者1.83
。对于这两种情况,我期望的结果是1.82
。
答案 0 :(得分:6)
众所周知,计算机中的浮点数有错误。请注意,您拥有的两个数字都接近1.825
。在第一种情况下,该数字足够小,可以与1.825
区分开来。
1.824999999999999
# => 1.824999999999999
在你的第二种情况下,有足够的9
s使得该值接近足以被视为1.825
:
1.82499999999999999
# => 1.825
然后,当您应用round
时,您会获得1.83
。
答案 1 :(得分:3)
在一定数量的(二进制)数字之后,Ruby无法表示Float
文字之间的差异,即使您已直接在源代码或控制台中输入值
1.82499999999999999 == 1.825
# => true
如果确实需要高精度,那么您可以查看BigDecimal
类。虽然您仍然可以输入足够的9
来达到该级别的限制。
答案 2 :(得分:3)
除了这里的许多优秀解释之外,我还想用BigDecimal
o = BigDecimal.new('1.82499999999999999', 17)
2.0.0p247 :011 > o.round(2).to_f
=> 1.82
另请注意,根据文档,#round
采用各种舍入模式。
价:
答案 3 :(得分:2)
浮标是众所周知的非常不精确的sawa和Neil指出。
如果这主要是测试问题,您可以使用assert_in_delta(如果您使用minitest)或be_within使用rSpec