是什么决定了整数m%n的符号?

时间:2013-01-24 04:43:32

标签: python modulo integer-division

Python中的模数令人困惑。

在Python中,%运算符正在计算余数:

>>> 9 % 5
4

然而:

>>> -9 % 5
1

为什么结果为1?而不是-4

5 个答案:

答案 0 :(得分:14)

因为在python中,符号与分母匹配。

>>> 9 % -5
-1
>>> -9 % 5
1

要解释为何以这种方式实施,请阅读blog post by Guido

答案 1 :(得分:5)

-10%5为0,即-10均匀地除以5.

你问为什么-9%5不是-4,答案是1和-4都可以是正确的答案,这取决于-9除以5是什么。当然-9除以5是1.8,但这是整数除法,在Python 3中用@表示,所以我在这里使用//清楚它是我们所说的整数除法。

我将通过不使用负数来解释这一点,这更容易。

9 // 5是1.也就是说,你只能从9减去5,剩下的就是4.但如果你再从9减去5,那么剩下的就变为-1!

因此,如果9 // 5为2,则-1为9%5的正确答案。

在Python 9 // 5中是1,因为Python整数除法是一个分区,即它总是向向下。如果它已经舍入 up 9 // 5将是2,而9%5将是-1。

现在让我们看一下使用负数时的情况:-9除以5现在为-2。 因为它是分区,所以它总是向下舍入。这意味着其余的是1.所以-9%5是1,而不是-4。

答案 2 :(得分:3)

这实际上与python如何舍入整数除法有关。

在数学上,对于任何int x和y

,以下必须始终为真
x == (x // y) * y + x % y

因此,我们可以说

x%y == x - (x // y)* y

现在回想一下,python将整数divison向负无穷大舍入,而不是向零。 例如-9 // 5给出-2,而不是-1。使用此逻辑,您将获得-9%5 = 1

答案 3 :(得分:2)

这样想:

0%5为0

1%5是1

那么......如果你倒退怎么办?

-1%5必须是4

-2%5必须为3

等等。

你会看到这个-9%5之后是1

注意:根据编程语言和%的实现,您可能会得到不同的结果,因为程序员不同意如何处理%中的负数

答案 4 :(得分:0)

在整数中,你不能总是选择quotient * divisor == dividend这样的商。如果product不等于dividend,则必须始终做出选择,是使其略小于dividend,还是略大于dividendproductremainder的总和构成dividend,这就是remainder。在任何情况下,股息和产品都必须接近,这意味着剩余部分的绝对值必须小于除数的绝对值。

divisor为正数时,products会随quotients增加而增加;当divisor为负时,products会随着quotients的增加而减少。在第一种情况下,产品来自下面,在第二种情况下,产品来自上面。在Python中,在两种情况下,只有当quotient到达下一个可能的dividend时,才会采用下一个product,与产品的运行方式相同。在此之前,只有remainder更改以适应下一个dividend,再次始终与股息更改方向相同,而不会中断零。这条规则在Python中是通用的,它始终存在。

这不是为什么做出这个选择的原因,但是这给出了发生了什么的想法(即,为什么结果是它们是什么,以及结果预期)。