负整数除法的出人意外结果

64

在我的应用程序中,我遇到了以下情况并对结果感到惊讶:

8/-7=-2(两个整数)。

这是什么意思?


仅在Python 2中?在Python 3.8.10(大约是2021年11月26日),屏幕上的结果为“-1.1428571428571428”。 - Peter Mortensen
5个回答

61

对于实际值,即8.0/(-7.0),结果大约为-1.143

使用整数除法得到的结果向更小的负值-2舍入。(这也称为"Floor division")

这就是为什么你会得到一些令人困惑的答案:

>>> 8/(-7)
-2
>>> 8/7
1

注意:在Python 3中,8/(-7)的结果将为-1.143。因此,如果您没有使用Python 2的理由,应该升级到Python 3。

在Python 3中,如果你仍想要整数除法,你可以使用//运算符。这将给出与Python 2中8/(-7)相同的答案。

关于此主题的Python增强提案可以在这里找到:PEP 238 -- Changing the Division Operator


2
@Ira:是的!不过他们在Python 3中改变了这个。 - Chris Cooper
1
@intuited:嗯,看起来是这样,但只有当你不像计算机那样思考时才是如此。5/2与一个一位右移相同,两种情况下都得到2。-5/2应该与-5的右移相同,即-3。问题在于Python是一种高级语言,你不应该知道这一点。这就是为什么整数除法一开始是错误的,现在已经被修复了。 - Lennart Regebro
4
@Lennart:所以你将-5除以2,得到商为-3,余数为1。 "为了还清我们欠你的5只鸸鹋,我们每人向你支付3只鸸鹋,而你将提供一只鸸鹋送我们两个回家,祝我们一路顺风。" 好的,我想这说得通。 - intuited
1
@intuited:a 应该等于 (a//b)*b + a%b。因此,-5//2 == -3。 - Neil G
3
对于自然数或实数领域内的所有x和y,使用该领域定义的除法运算符,(n+d)/d = (n/d)+1。Python定义整数除法的方式使得即使n为负数,该有用的公理仍然成立。即使一些人可能期望整数应该从实数中借用(-n)/d = -(n/d),那个公理很少有用。当尝试从数字中提取数字时,让"-123 mod 10"产生7并没有太大意义,但让它产生-3也不更好。 - supercat
显示剩余6条评论

24

Python对于负数除法和正数除法总是执行“向下取整”。

也就是说

1/10 = 0
1/-10 = -1

但有时我们需要把1/-10变成0。

我发现可以先使用浮点数除法,然后将结果转换为整数,例如:

int(float(1)/-10) = 0

对我来说那很好,无需导入未来除法或升级到 Python 3

希望能帮到你~


8
要让Python自动将整数除法转换为浮点数,您可以使用以下代码:

from __future__ import division

现在:

8/-7=-1.1428571428571428

这个特性在标准的Python 2中不存在,是为了不破坏依赖整数除法的现有代码。

然而,在Python 3中,这是默认行为。


3

当两个值都是整数时,Python使用地板除法。


但仅适用于Python 2?也许更新您的答案不要包含“编辑:”,“更新:”或类似内容 - 答案应该看起来像是今天写的)? - Peter Mortensen

-1
在Python中,/运算符用于整数除法。你可以将其看作是浮点除法后跟一个floor操作。
例如,

8/7 == floor(8.0/7.0) == 1

8/-7 == floor(8.0/-7.0) == -2


1
不,/ 不是用于整数除法,而是用于除法。然而,在 Python 2 中,两个整数相除会返回一个整数。这很令人惊讶,并且在 Python 3 中已经修复了。 - Lennart Regebro
3
对于C程序员或阅读过手册的人来说,这并不算什么惊讶,也不是“错误”的。 - John Machin
1
@John:它违反了Python的核心原则,因此在Python的背景下可以被称为“错误”。 - Lennart Regebro
@stackoverflowuser2010 不,对于不了解 Python 的 C/C++ 程序员来说这是意外的。但是对他们来说并不“错误”。 - Lennart Regebro
但仅适用于Python 2?也许更新您的答案不要包含“编辑:”,“更新:”或类似内容 - 答案应该看起来像是今天写的)? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接