Java中的Mod产生负数

时间:2011-03-21 23:36:18

标签: java math mod

当我计算int i = -1 % 2时,我在Java中得到-1。在Python中,我得1作为-1 % 2的结果。 我需要做些什么来使用模数函数在Java中获得相同的行为?

5 个答案:

答案 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. :)

Source: https://stackoverflow.com/a/25830153/2311557

答案 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 yx - (x DIV y) * y,其中x DIV yTRUNC(x / y)),MOD需要正分母并返回正结果。