【问题标题】:Why does print int (100*(11.20 - 11)) prints 19 instead of 20 in python?为什么 print int (100*(11.20 - 11)) 在 python 中打印 19 而不是 20?
【发布时间】:2015-03-03 10:32:20
【问题描述】:

我刚刚开始学习 python 教程。为什么

print  int (100*(11.20 - 11))

在 python 中打印 19 而不是 20 ??整数完成了某种四舍五入,但我无法理解。感谢您的帮助。

【问题讨论】:

  • 更不用说print 100*(11.20 - 11)20.0相呼应
  • @dwn 实际上,如果您想了解它的技术,那么在那个问题中,问题是 + 不准确,而在这个问题中,问题是 11.20 不完全是 @ 987654329@,如果我没记错的话,所有的浮点运算都是精确的。
  • 引用的问题包含多个操作,答案也是如此
  • @dwn 接受的答案是关于== 的通常迷信垃圾(本问题中没有出现的等式运算符)并且没有解释为什么浮点结果应该不同于预期的结果所有涉及的浮点运算都是精确的

标签: python floating-point int


【解决方案1】:

发生这种情况是因为11.20 不完全是 1120/100,但略小于该值。所以11.20 - 11 最终会略小于 20/100 (*)。乘以10011.20 - 11 产生一个略低于 20 的浮点数,并且由于 int(...) 截断(向零舍入),结果为 19。

出于效率原因,浮点数表示为以 2 的幂为分母的分数。所以 1/2, 1/4, 1/16, ... 可以精确地表示为浮点数,但 1/5 不能(没有 2 的幂可以用作分母来精确地表示 1/5) .

(*) 这个浮点减法恰好是精确的,因此结果与 20/100 相比的绝对误差与 11.20 与 1120/100 相比的绝对误差完全相同。请注意,相对误差被放大了,因为相同的绝对误差适用于小得多的值。减去已经不精确且接近 is called “catastrophic cancellation” 的值,而 Python 行中的减法就是这样一种灾难性的取消。

【讨论】:

    【解决方案2】:
    11.2 - 11
    

    实际产生

    0.1999999999999993
    

    四舍五入到 19。

    【讨论】:

      【解决方案3】:

      如前所述,这是浮点精度的舍入问题。你可以看到使用:

      print '%.20f' % (100*(11.20 - 11))
      >>> 19.99999999999992894573
      

      【讨论】:

        【解决方案4】:

        在 Python 中,int() 向 0 for reasons Guido explains here 截断。这意味着负数实际上会看到相反的效果 (related SO question & answer)。

        【讨论】:

        • “flooring”表示向 -infinity 四舍五入。 int(…) 截断,表示向 0 舍入。它们对于正数是一样的,但对于负数则不然。
        猜你喜欢
        • 2016-05-13
        • 2017-10-07
        • 2016-06-07
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多