在Python文档中,它显示“The % (modulo) operator yields the remainder from the division of the first argument by the second.”
所以给出
a % b
据我所知,剩余部分是将A除以B均匀分开的数字。所以21%3 = 0,-25%23 = -2。 我不明白的是当A为负时会发生什么。
例如,
-23 % 22
会产生
21
这是第一个全等模1的正整数。但-1是剩余的-23%22。那么文档错了吗? Python中的模运算符%不会产生%b中的余数,而是与B一致的第一个正整数?我很困惑。
答案 0 :(得分:7)
有三种不同的明显方法来定义负数的整数除法,以及三种相应的方法来定义余数:
所有这三个都保留了整数除法的基本定律:
dividend = divisor * quotient + remainder
所以,三者中没有一个是“正确的”或“错误的”。*
当然,这并不能阻止人们进行圣战。 Knuth在“数学上正确”的基础上主张分裂。 Wirth认为截断分裂是因为它“不那么令人惊讶”。 Raymond Boute认为整数除法是根据欧几里得算法定义的。我不会试图解决几十年前的圣战,他们争辩说他们三个人,包括两个最重要的人,都是错的......
有些语言通过两种不同的功能来解决这个问题。**
我们只是说Python选择了Knuth的定义,因此它的模数运算符具有除数的符号。
*当然,选择商和余数的非匹配定义是另一个故事。或者更糟糕的是,指定一个并保留其他实现定义,如C在C99之前所做的那样。
**这一点特别有趣,因为它们并不总是一致的。至少在他们被称为rem
和mod
时,rem
是与div
一起使用的那个,而mod
是无论是地板还是欧几里德都没有当他们被称为div
和rem
或remainder
和mod
时,请与modulo
一起使用...
答案 1 :(得分:0)
如果将-23除以22,则得到-23 = -2 * 22 + 21.在Python中,“余数”总是在0和除数之间(但不等于除数)。对于正除数,商和模数通常在数学中定义。在某些编程语言中,负余数用于正除数,但不用于Python。