为什么对 Float 调用 to_i 会从值中减一?
我有一个例子,我正在对 Float 对象进行一些数学运算,当我对其调用 to_i 时,它会减一。
value = 0.29 * 100
value.to_i
=> 28
我知道浮点数是不精确的表示,但这超出了我的预期。这是怎么回事?我该如何防止这种情况发生?
我正在使用 ruby 1.8.7(它也发生在 1.8.6 中)。
I have a case where I am doing some math on a Float object and when I call to_i on it it is being reduced by one.
value = 0.29 * 100
value.to_i
=> 28
I know that floating point numbers are inexact representations but this is off by more than I would expect. What is going on and how can I prevent this?
I'm using ruby 1.8.7 (it also happens in 1.8.6).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
并非所有浮点数都是不精确的。
29
是精确的,0.25
是精确的,但0.29
不是。如果小数点右侧缺少 50 位,即使有一位,默认截断转换也会返回下一个较低的整数。这就是
#round
存在的原因。Not all floating point numbers are inexact.
29
is exact,0.25
is exact, but0.29
is not. If even one bit is missing 50 bits to the right of the decimal point, the default truncating conversion will return the next lower integer.And that's why
#round
exists.快速检查 irb 显示
0.29 * 100
的计算结果为28.999...
。调用Float#to_i
完成剩下的工作,最终得到 28。A quick check in irb reveals that
0.29 * 100
evaluates to28.999...
. CallingFloat#to_i
does the rest and you end up with 28.