负整数除法令人惊讶的结果

Posted

技术标签:

【中文标题】负整数除法令人惊讶的结果【英文标题】:Negative integer division surprising result 【发布时间】:2011-04-04 06:25:04 【问题描述】:

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

8/-7=-2(均为整数)。

这是什么意思?

【问题讨论】:

仅在 Python 2 中?在 Python 3.8.10(约 2021-11-26)中,屏幕上的结果为-1.1428571428571428 【参考方案1】:

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

您使用整数除法的结果正在向下舍入到更负的-2。 (这也被称为“楼层划分”)

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

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

注意:这在 Python 3 中是“固定的”,8/(-7) 的结果将是 -1.143。所以如果你没有理由使用 Python 2,你应该升级。 ;)

在 Python 3 中,如果您仍然需要整数除法,可以使用 // 运算符。这将为您提供与 Python 2 中的 8/(-7) 相同的答案。

这是一个关于该主题的 Python 增强提案:PEP 238 -- Changing the Division Operator

【讨论】:

@Ira:是的!他们为 python 3 改变了这个。 @intuited:嗯,看起来可能是这样,但前提是你不像计算机那样思考。 5/2 与一位右移是一样的,在这两种情况下你都得到 2。然后-5/2 应该与-5 的右移相同,即-3。这里的问题当然是 Python 是一种高级语言,你不必知道这一点。这就是为什么整数除法首先是错误的,现在已经修复了。 @Lennart:所以你将 -5 除以 2 得到 -3 余数为 1。“为了解决我们欠你的 5 个鸸鹋债务,我们将每人付给你 3 个鸸鹋,你将提供我们用一只鸸鹋将我们俩带回家,神速”。当然,我猜是有道理的。 @intuited:a 应该等于 (a//b)*b + a%b。因此 -5//2 == -3。 @LennartRegebro:对于自然数或实数领域内的所有 x 和 y,使用为领域定义的除法运算符,(n+d)/d = (n/d)+1 . Python 以这样一种方式定义整数除法,即即使 n 为负数,该有用的公理也成立。即使有些人可能期望整数应该从实数中借用 (-n)/d = -(n/d),该公理也很少有用。在尝试从数字中提取数字时,让“-123 mod 10”产生 7 并不是非常有用,但让它产生 -3 也好不到哪里去。【参考方案2】:

Python 总是对负数除法和正数除法进行“地板除法”。

那是

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

但有时我们需要 1/-10 为 0

我发现它可以通过先使用浮点除法然后将结果转换为 int 来完成,例如

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

这对我来说很好,不需要导入未来的部门或升级到 Python 3

希望对你有帮助~

【讨论】:

【参考方案3】:

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

from __future__ import division

现在:

8/-7=-1.1428571428571428

标准 Python 2 中没有此功能,不会破坏依赖整数除法的现有代码。

不过,这是 Python 3 的默认行为。

【讨论】:

【参考方案4】:

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

【讨论】:

但仅适用于 Python 2?也许update your answer(没有“编辑:”,“更新:”或类似的 - 答案应该看起来好像是今天写的)?【参考方案5】:

在 Python 中,/ 运算符用于整数除法。您可以将其视为浮点除法,然后是 floor 操作。

例如,

8/7 == 楼层(8.0/7.0) == 1

8/-7 == 楼层(8.0/-7.0) == -2

【讨论】:

不,/不是整数除法,是除法。然而,在 Python 2 中,两个整数相除会返回一个整数。这是令人惊讶的,并且已在 Python 3 中得到修复。 @Lennart:对于 C 程序员和任何读过手册的人来说,这并不完全是一个震惊,也没有“错误”。 @John:它违反了 Python 的核心原则,因此在 Python 的上下文中可以称为“错误”。 @***user2010 不,对于不懂 Python 的 C/C++ 程序员来说,这是意料之外的。然而,这对他们来说也不是“错误的”。 但仅适用于 Python 2?也许update your answer(没有“编辑:”,“更新:”或类似的 - 答案应该看起来好像是今天写的)?

以上是关于负整数除法令人惊讶的结果的主要内容,如果未能解决你的问题,请参考以下文章

C整数除法和下限

python的//是啥

大整数的有底除法和欧几里得除法

Powershell:将分数转换为整数 - 令人惊讶的舍入行为

python中%代表啥意思?

python中//是啥意思