在 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 中的模运算符 % 不会产生 a % b 中的余数,而是产生与 B 一致模的第一个正整数?我很困惑。
最佳答案
有三种不同的明显方式来定义负数的整数除法,以及三种相应的方式来定义余数:
- 底除法,其中商取负无穷大,余数与除数的符号相同。
- 截断除法,其中商被截断为零,余数与被除数的符号相同。
- 欧几里得除法,其中商在余数为正的任何方向上被截断。
所有这三个都保留了整数除法的基本定律:
dividend = divisor * quotient + remainder
所以,这三个都没有“对”或“错”。*
当然,这并不能阻止人们进行圣战。 Knuth 认为底除法是“数学上正确的”。 Wirth 主张截断除法,因为它“不那么令人惊讶”。 Raymond Boute 认为整数除法是根据欧几里德算法定义的。我不会试图通过争论他们三个人,包括该领域最重要的两个人,都错了来解决一场长达数十年的圣战……
一些语言通过具有两个不同的函数来解决这个问题。**
假设 Python 采纳了 Knuth 的定义,因此其模运算符具有除数的符号。
* 当然,选择商和余数的不匹配定义是另一回事。或者,更糟糕的是,指定一个而让另一个实现定义,就像 C99 之前的 C 所做的那样。
** 这特别有趣,因为它们对于哪个是哪个并不总是一致。至少当它们被称为 rem
和 mod
时,rem
是与 div
一起使用的,而 mod
是 floored 或 Euclidean 中不符合 div
的那个,当它们被称为 rem
和 remainder
时或 mod
和 modulo
...
关于Python模数与余数相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19285497/