具有负值的模数运算 - 奇怪的是什么?

lur*_*rks 17 python math modulo

你能告诉我多少钱(-2) % 5?根据我的Python解释器是3,但你有一个明智的解释吗?

我读过在某些语言中,结果可能与机器有关,但我不确定.

Kon*_*lph 16

顺便说一句:大多数编程语言都不同意Python并给出结果-2.根据模数的解释,这是正确的.然而,最常见的数学定义表明ab的模数是a/b除法的(严格为正)余数r.更准确地说,根据定义,0 <= r < b.


mar*_*ime 13

负面模数运算的结果似乎是编程语言依赖,这里是一个列表http://en.wikipedia.org/wiki/Modulo_operation


Tni*_*son 12

你的Python解释器是正确的.计算模量的一种(愚蠢的)方法是减去或加上模数,直到结果值在0和(模数-1)之间.

例如:13 mod 5 =(13-5)mod 5 =(13-10)mod 5 = 3

或者在你的情况下:-2 mod 5 =( - 2 + 5)mod 5 = 3


tzo*_*zot 6

就像文档在二进制算术运算中所说的那样,Python保证:

整数除法和模运算符通过以下标识连接:x == (x/y)*y + (x%y).整数除法和模数也与内置函数divmod()连接:divmod(x, y) == (x/y, x%y).

真的,

>>> divmod(-2, 5)
(-1, 3).
Run Code Online (Sandbox Code Playgroud)

另一种可视化此方法均匀性的方法是计算divmod一小段数字:

>>> for number in xrange(-10, 10):
...     print divmod(number, 5)
...
(-2, 0)
(-2, 1)
(-2, 2)
(-2, 3)
(-2, 4)
(-1, 0)
(-1, 1)
(-1, 2)
(-1, 3)
(-1, 4)
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(1, 4)
Run Code Online (Sandbox Code Playgroud)