在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取模完全相同的第一个正整数。我很困惑。
最佳答案
定义负数的整数除法有三种不同的明显方法,以及定义余数的三种对应的方法:
所有这三个都保留了整数除法的基本定律:
dividend = divisor * quotient + remainder
因此,这三个都不是“对”或“错”。*
当然,这并不能阻止人们进行圣战。克努斯(Knuth)主张以“数学上正确的”为基础进行底数划分。维尔斯(Worth)主张截断 split ,因为这“不足为奇”。雷蒙德·布特(Raymond Boute)认为整数除法是根据欧几里得算法定义的。我不会试图通过争论他们三个人,包括该领域最重要的两个人,来解决数十年的圣战……
一些语言通过具有两种不同的功能来解决此问题。**
我们只说Python接受了Knuth的定义,所以它的模运算符具有除数的符号。
*当然,选择商和余数的不匹配定义是另一回事。或者,更糟的是,像C在C99之前所做的那样,指定一个并保留另一个实现定义。
**这特别有趣,因为它们并不总是一致地确定哪个是哪个。至少当它们分别被称为
rem
和mod
时,rem
是与div
一起使用的,而mod
是无底的或Euclidean不与div
一起使用的,当它们分别被称为rem
和remainder
或mod
和modulo
时……关于Python模数与余数相同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19285497/