23 % -5 = -2
23 % 5 = 3
有人能解释一下吗?因为我明天要考试。我想说的是,由于-5 * -5 = 25
,然后25 - 2 = 23
,这就是他们得到23
的方法。这样说对吗?
a,b = divmod(n,d)
,则 a*d + b == n
。23//5 == 4
和 23//-5 == -5
(Python始终执行地板除法)。因此,我们有4*5 + 3 == 23
和 -5*-5 - 2 == 23
,就像你所说的一样。在Python中,%使用“模运算”;它与取除法操作的余数不同。
a - int(a/n) * n
虽然在某些计算机语言中有时是等效的。
数学表达式可以在此处明确找到:http://en.wikipedia.org/wiki/Modulo_operation
因此,显然,在Python中,“%”操作使用以下表达式:
mod(a, n) = a - n * floor(a / n)
因此,
23%-5 = mod(23,-5)= 23 -(-5)* floor(23 / -5)= 23 -(-5)* -5 = -2
和
23%5 = mod(23,5)= 23 - 5 * floor(23/5)= 23 - 5 * 4 = 3
此外,您可能会发现有趣的是
-23%5 = mod(-23,5)=(-23)- 5 * floor(-23/5)= -23 - 5 *(-5)= 2
因为floor()操作将整数值向负无穷大取整。
让我们将其写成 N=kM+R。
我们有 23 = -5*(-5) - 2,以及 23 = 4*5 + 3。
针对您的目的,最简单的问题定义方式是考虑以下定义:
a mod n = R,其中余数R必须满足0<= R
因此,在mod -5算术中,0<= R < -4,即R可以是0、-1、-2、-3、-4之一。
也就是说,您需要将n从a中减去(或加上),直到R进入上述范围:
所以
23 % 5 是 (23-4*5) = 23-20 = 3
但是
23 % -5 是 (23+5*(-5)) = 23-25 = -2
23 % 5 = 3,因为4 * 5 = 20,当你将23除以20时,余数为3。你可以认为这是最接近而不超过的。
至于23 % -5,那么答案因编程语言而异。
对于Python来说,它是-2,因为它总是返回除数的值,这是因为5 * 5 = 25,当你在Python中将23除以25时,余数为-2(因为它必须是负数,因为除数是负数),所以我们有25-2 = 23。
值得注意的是,正式的数学定义规定b是正整数。
[0],... [n-1]
,但并非必须如此。[42]
和[-99]
是模2下完全正确的等价类。 - nneonneob
,所以我做了一个假设。 - nneonneo
math.fmod
来获得与 C 或 Java 相同的行为。 - 0x2b3bfa0