1

可能重复:
Java 中的 Mod 产生负数

当我尝试打印 -16 mod 57 时,我应该得到 41。但是,我一直得到 -16 作为我的答案。是什么赋予了?

这是我的代码:

public class TestMod {

public static void main(String[] args) {
    int number = -16;
    int mod = 57;
    int answer = number%mod;
    System.out.println(answer);

}

}
4

2 回答 2

11

JLS

在二进制数值提升(第 5.6.2 节)之后,整数操作数的余数运算产生一个结果值,使得 (a/b)*b+(a%b) 等于 a。

替换您示例中的数字,您会看到这-16是语言规范的要求。

即使在被除数是其类型的最大可能量级的负整数并且除数是-1(余数是0)的特殊情况下,这个恒等式也成立。

由这个规则得出,余数运算的结果只有当被除数为负时才能为负,只有当被除数为正时才能为正。此外,结果的大小总是小于除数的大小。

以下是获得预期结果的方法:

public static void main(String[] args) {
    int number = -16;
    int mod = 57;
    int answer = ((number % mod) + mod) % mod;
    System.out.println(answer);

}
于 2013-01-21T19:41:32.707 回答
3

当第一个操作数为负数时,余数运算符%返回负数结果。这是许多语言中的常见行为。

于 2013-01-21T19:41:04.363 回答