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