浮动的奇怪结果

时间:2014-02-26 12:07:40

标签: ruby

1.824999999999999.round(2)
# => 1.82
1.82499999999999999.round(2)
# => 1.83

我不明白为什么第一种情况下的结果是1.82而后者1.83。对于这两种情况,我期望的结果是1.82

4 个答案:

答案 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采用各种舍入模式。

价:

  1. http://www.ruby-doc.org/stdlib-2.1.0/libdoc/bigdecimal/rdoc/BigDecimal.html#method-c-mode
  2. http://www.ruby-doc.org/stdlib-2.1.0/libdoc/bigdecimal/rdoc/BigDecimal.html#method-i-round

答案 3 :(得分:2)

浮标是众所周知的非常不精确的sawa和Neil指出。

如果这主要是测试问题,您可以使用assert_in_delta(如果您使用minitest)或be_within使用rSpec