在Java中计算int i = -1 % 2
,结果为-1
。而在Python中,计算-1 % 2
的结果为1
。
为了在Java中达到同样的效果,你需要使用如下代码:
int i = Math.floorMod(-1, 2);
这里的问题在于,在Python中,%运算符返回模数(modulus),而在Java中它返回余数(remainder)。正数参数下这些函数会给出相同的结果,但对于负数输入,模数总是返回正结果,而余数可能会给出负结果。在这个问题中有更多相关信息。
您可以通过以下方式找到正值:
int i = (((-1 % 2) + 2) % 2)
或者这样:
int i = -1 % 2;
if (i<0) i += 2;
(显然,-1或2可以是任何您想要的分子或分母)
(((-3 % 4) + 4) % 4) = 1
(жүҖжңҹжңӣзҡ„з»“жһң)пјҢд»ҘеҸҠ(((3 % 4) + 4) % 4) = 3
(еҗҢж ·жҳҜжүҖжңҹжңӣзҡ„з»“жһң)гҖӮе®ғйҖӮз”ЁдәҺжӯЈж•°е’Ңиҙҹж•°йҷӨж•°гҖӮ - The111n=-1000
,m=3
,正确的答案应该是 2
,但是根据你的公式计算得到的答案仍然为负数。 - Felipe Nardi Batista自从Java 8以来,您可以使用Math.floorMod()方法:
Math.floorMod(-1, 2); //== 1
注意:如果模数的值(这里是2
)为负数,则所有输出值也将为负数。 :)如果你需要 n % m
,则:
int i = (n < 0) ? (m - (abs(n) % m) ) %m : (n % m);
数学解释:
n = -1 * abs(n)
-> n % m = (-1 * abs(n) ) % m
-> (-1 * (abs(n) % m) ) % m
-> m - (abs(n) % m))
if b > 0:
int mod = (mod = a % b) < 0 ? a + b : a;
%
运算符。if
还是%
快,这取决于你的CPU和你输入的数据,因为分支预测的原因-如果条件具有可预测的模式,则if
更快。 - Vitruvie(maybeNegative >> 31) ^ thingToMaybeAdd + thingToAddTo
。 - Scott Careyint i = -1 & ~-2; // -1 MOD 2 is 1
相比之下,Pascal语言提供了两个运算符;REM取分子的符号(x REM y
是x - (x DIV y) * y
,其中x DIV y
是TRUNC(x / y)
),而MOD需要一个正的分母并返回一个正的结果。
%
运算符定义为产生余数,但将其称为模数运算符。令人困惑的是,https://en.wikipedia.org/wiki/Modulo_operation声称*模数*运算在计算和数学中都产生**余数**,但也声称“整数取模n的数字范围是0到n-1”。 - LarsH