【问题标题】:Why does calling to_i on a Float subtract one from the value?为什么在 Float 上调用 to_i 会从值中减去 1?
【发布时间】:2011-12-06 17:55:55
【问题描述】:

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

value = 0.29 * 100
value.to_i
=> 28

我知道浮点数是不精确的表示,但这超出了我的预期。这是怎么回事,我该如何预防?

我使用的是 ruby​​ 1.8.7(它也发生在 1.8.6 中)。

【问题讨论】:

  • 人们何时会理解浮点值在转换为整数时会失去精度?
  • 在这种情况下你可能想使用value.ceil
  • 您预计会发生什么?
  • 我期待的结果是 29。

标签: ruby floating-point-precision


【解决方案1】:
(0.29 * 100).round
 => 29 

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

这就是#round 存在的原因。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您如何看到它的计算结果为28.999...
    • 启动irb,输入0.29 * 100,按回车,它会告诉你表达式的值。
    • 我这样做了,我得到的是29.0 而不是28.999...,因此我认为 to_i 会返回 29。
    • 嗯,然后尝试使用"%.20f" % (0.29 * 100)。使用普通 Float#inspect 时,可能会在某些版本中对输出值进行四舍五入
    • 啊...产生了28.99999999999999644729
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2013-07-04
    • 2019-12-31
    相关资源
    最近更新 更多