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