为什么对 Float 调用 to_i 会从值中减一?

发布于 2024-12-19 20:01:08 字数 216 浏览 0 评论 0原文

我有一个例子,我正在对 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

伤痕我心 2024-12-26 20:01:08
(0.29 * 100).round
 => 29 

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

这就是 #round 存在的原因。

(0.29 * 100).round
 => 29 

Not all floating point numbers are inexact. 29 is exact, 0.25 is exact, but 0.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.

孤星 2024-12-26 20:01:08

快速检查 irb 显示 0.29 * 100 的计算结果为 28.999...。调用 Float#to_i 完成剩下的工作,最终得到 28。

A quick check in irb reveals that 0.29 * 100 evaluates to 28.999.... Calling Float#to_i does the rest and you end up with 28.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文