我有一个案例,我在Float对象上做一些数学运算,当我在它上面调用to_i时,它被减少了一个。
value = 0.29 * 100
value.to_i
=> 28
我知道浮点数是不精确的表示,但这比我预期的要多。发生了什么事,我该如何防止这种情况发生?
我正在使用ruby 1.8.7(它也发生在1.8.6中)。
答案 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。