174

当我计算时,int i = -1 % 2 我会-1进入 Java。在 Python 中,我得到1-1 % 2. 我必须做什么才能在 Java 中使用模函数获得相同的行为?

4

5 回答 5

196

这里的问题是,在 Python 中, % 运算符返回模数,而在 Java 中,它返回余数。这些函数为正参数给出相同的值,但模数总是为负输入返回正结果,而余数可能给出负结果。在这个问题中有更多关于它的信息。

您可以通过执行以下操作找到正值:

int i = (((-1 % 2) + 2) % 2)

或这个:

int i = -1 % 2;
if (i<0) i += 2;

(显然 -1 或 2 可以是您想要的分子或分母)

于 2011-03-21T23:42:30.757 回答
138

从 Java 8开始,您可以使用Math.floorMod()方法:

Math.floorMod(-1, 2); //== 1

注意:如果模值(此处2)为负,则所有输出值也将为负。:)

来源:https ://stackoverflow.com/a/25830153/2311557

于 2015-06-30T13:53:02.370 回答
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))
于 2011-03-21T23:50:11.997 回答
2
if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;

不使用%运算符两次。

于 2017-01-08T15:05:07.723 回答
0

如果模数是 2 的幂,那么您可以使用位掩码:

int i = -1 & ~-2; // -1 MOD 2 is 1

相比之下,Pascal 语言提供了两个运算符;REM 采用分子的符号 ( x REM yis x - (x DIV y) * ywhere x DIV yis TRUNC(x / y)),而 MOD 需要正分母并返回正结果。

于 2011-03-22T00:15:56.727 回答