Java 中的 Mod 产生负数

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

197275 次浏览

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

你可以通过这样做来找到积极的价值:

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

或者这样:

int i = -1 % 2;
if (i<0) i += 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))

如果模是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 需要一个正分母并返回一个正结果。

因为 Java8 可以使用 数学方法:

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

注意: 如果模值(这里是 2)为负,则所有输出值也为负。 :)

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

if b > 0:
int mod = (mod = a % b) < 0 ? a + b : a;

不使用 %操作符两次。