【问题标题】:Integer division compared to floored quotient: why this surprising result?整数除法与底商相比:为什么会出现这个令人惊讶的结果?
【发布时间】:2010-01-07 10:33:25
【问题描述】:

今天,Python 的//“整数除法”运算符让我感到惊讶:

>>> math.floor(11/1.1)
10.0
>>> 11//1.1
9.0

documentation 读作“x 和 y 的(地板)商”。那么,为什么 math.floor(11/1.1) 等于 10,而 11//1.1 等于 9?

【问题讨论】:

标签: python python-3.x python-2.x integer-division floor


【解决方案1】:

因为 1.1 不能完全用二进制形式表示;近似值略高于 1.1 - 因此除法结果有点太小。

尝试以下方法:

在 Python 2 下,在控制台输入:

>>> 1.1
1.1000000000000001

在 Python 3.1 中,控制台将显示 1.1,但在内部,它仍然是相同的数字。

但是:

>>> 11/1.1
10.0

正如 gnibbler 所指出的,这是在浮点数的可用精度限制内“内部舍入”的结果。正如 MYYN 在他的评论中指出的那样,// 使用与math.floor() 不同的算法来计算地板除法结果,以便尽可能地保留a == (a//b)*b + a%b

如果您需要此精度,请使用 Decimal 类型。

【讨论】:

  • 但是根据 Python 11.0/1.1 == 10.0 是真的
  • 我们知道 1.1 存储为 1.1000000000000001,所以 Python 中的结果 11.0/1.1 是 9.999999999999999090909090909 但最接近这个数字的浮点数实际上是 10.0,所以结果恰好是 10.0
  • @Tim 我想到了这一点,我相信这是区别 math.floor(11/1.1) 和 11//1.1 的关键。然而,正如 gnibbler 指出的那样,1.1 由一个稍大的数字表示这一事实仅表明 math.floor(11/1.1) 应该是 9.0,这使得原始问题仍然悬而未决。
  • @EOL,因为 11/1.1 的计算结果正好是 10.0,所以 math.floor(11/1.1)=math.floor(10.0),但这只是因为四舍五入的运气
  • @gnibbler:是的,让我吃惊的是“运气”方面:两个“相同”的操作以不同的方式表现。 :) 正如 The MYYN 所指出的,解释在实现中。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 2022-06-11
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2019-10-05
相关资源
最近更新 更多