3

我想从 Java 中的 x mod -3 中得到负数。例如:1 mod -3 = -2 或 2 mod -3 = -1

有什么方法可以解决这个问题吗?

4

3 回答 3

3

Java 中的%运算符不是取运算符,而是余数。(他们不是一回事)这解释了你得到的不同迹象。从当前的Java 语言规范,第15.17.3节:

据说二进制 % 运算符从隐含的除法中产生其操作数的其余部分;左边的操作数是被除数,右边的操作数是除数。

在 C 和 C++ 中,余数运算符只接受整数操作数,但在 Java 编程语言中,它也接受浮点操作数。

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

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

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

于 2012-11-04T15:22:58.457 回答
2

X mod -Y正如您所定义的,它可以通过求解-X mod Y然后否定答案来计算。

示例:1 mod -3-> -1 mod 3 = 2->-2

特别是在 Java 中, do -X % Y,如果非零则添加Y,然后否定答案。

public static int negativeMod(int x, int y) {
   if (y > 0) return x % y;

   int newAnswer = (-1 * x) % (-1 * y);
   if (newAnswer != 0) newAnswer -= y;

   return -1 * newAnswer;
}
于 2012-11-04T15:17:32.633 回答
0

这很容易。如果余数不为 0,则减去模数。对于示例 1 mod -3, 1 - 3 是 -2,即您想要的答案。这是数学恒等式 a == a - n (mod n) 的简单结果。

于 2012-11-05T01:20:34.057 回答