为什么在Float上调用to_i会从值中减去一个?

时间:2011-12-06 17:55:56

标签: ruby floating-point-precision

我有一个案例,我在Float对象上做一些数学运算,当我在它上面调用to_i时,它被减少了一个。

value = 0.29 * 100
value.to_i
=> 28

我知道浮点数是不精确的表示,但这比我预期的要多。发生了什么事,我该如何防止这种情况发生?

我正在使用ruby 1.8.7(它也发生在1.8.6中)。

2 个答案:

答案 0 :(得分:6)

(0.29 * 100).round
 => 29 

并非所有浮点数都不准确。 29确切地说,0.25是准确的,但0.29不是。如果即使一位在小数点右侧缺少50位,默认截断转换也将返回下一个较低的整数。

这就是#round存在的原因。

答案 1 :(得分:3)

快速检查irb显示0.29 * 100评估为28.999...。打电话给Float#to_i完成剩下的工作,结果是28。