我想从 Java 中的 x mod -3 中得到负数。例如:1 mod -3 = -2 或 2 mod -3 = -1
有什么方法可以解决这个问题吗?
Java 中的%
运算符不是取模运算符,而是余数。(他们不是一回事)这解释了你得到的不同迹象。从当前的Java 语言规范,第15.17.3节:
据说二进制 % 运算符从隐含的除法中产生其操作数的其余部分;左边的操作数是被除数,右边的操作数是除数。
在 C 和 C++ 中,余数运算符只接受整数操作数,但在 Java 编程语言中,它也接受浮点操作数。
在二进制数值提升(第 5.6.2 节)之后,整数操作数的余数运算产生一个结果值,使得 (a/b)*b+(a%b) 等于 a。
即使在被除数是其类型的最大可能量级的负整数并且除数是-1(余数是0)的特殊情况下,这个恒等式也成立。
由这个规则得出,余数运算的结果只有当被除数为负时才能为负,只有当被除数为正时才能为正。此外,结果的大小总是小于除数的大小。
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;
}
这很容易。如果余数不为 0,则减去模数。对于示例 1 mod -3, 1 - 3 是 -2,即您想要的答案。这是数学恒等式 a == a - n (mod n) 的简单结果。