当我计算int i = -1 % 2
时,我在Java中得到-1
。在Python中,我得1
作为-1 % 2
的结果。
我需要做些什么来使用模数函数在Java中获得相同的行为?
答案 0 :(得分:152)
这里的问题是在Python中%运算符返回模数,在Java中它返回余数。这些函数为正参数提供相同的值,但模数总是返回负输入的正结果,而余数可能给出负结果。在this question中有关于它的更多信息。
您可以通过以下方式找到正值:
int i = (((-1 % 2) + 2) % 2)
或者这个:
int i = -1 % 2;
if (i<0) i += 2;
(显然-1或2可以是你想要的分子或分母)
答案 1 :(得分:90)
Since Java 8 you can use the Math.floorMod() method:
Math.floorMod(-1, 2); //== 1
Note: If the modulo-value (here 2
) is negative, all output values will be negative too. :)
答案 2 :(得分: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))
答案 3 :(得分:2)
if b > 0:
int mod = (mod = a % b) < 0 ? a + b : a;
两次不使用%
运算符。
答案 4 :(得分:-1)
如果模数是2的幂,那么你可以使用位掩码:
int 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需要正分母并返回正结果。