Python中的模数令人困惑。
在Python中,%
运算符正在计算余数:
>>> 9 % 5
4
然而:
>>> -9 % 5
1
为什么结果为1
?而不是-4
?
答案 0 :(得分:14)
答案 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
,还是略大于dividend
。 product
与remainder
的总和构成dividend
,这就是remainder
。在任何情况下,股息和产品都必须接近,这意味着剩余部分的绝对值必须小于除数的绝对值。
当divisor
为正数时,products
会随quotients
增加而增加;当divisor
为负时,products
会随着quotients
的增加而减少。在第一种情况下,产品来自下面,在第二种情况下,产品来自上面。在Python中,在两种情况下,只有当quotient
到达下一个可能的dividend
时,才会采用下一个product
,与产品的运行方式相同。在此之前,只有remainder
更改以适应下一个dividend
,再次始终与股息更改方向相同,而不会中断零。这条规则在Python中是通用的,它始终存在。
这不是为什么做出这个选择的原因,但是这给出了发生了什么的想法(即,为什么结果是它们是什么,以及结果预期)。