我的模数做错了吗?因为在Java -13 % 64
中应该进行评估,-13
但是我得到了51
。
%
是余数运算符。
我的模数做错了吗?因为在Java -13 % 64
中应该进行评估,-13
但是我得到了51
。
%
是余数运算符。
Answers:
负数模数的两种定义都在使用-有些语言使用一种定义,而另一种使用。
如果要为负输入获得负数,则可以使用以下方法:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
同样,如果您使用的是在否定输入中返回负数的语言,并且您希望使用正数:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
A)如果x
为负,则其余为负,即x % y == -(-x % y)
。B)y
无效的迹象,即x % y == x % -y
由于“数学上”都正确:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
Java语言开发人员必须选择其中一个选项,他们选择了:
结果的征兆等于股息的征兆。
用Java规范说:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
-13 % 64 = 51
在我期望的时候给我-13
?”。
int result = (-5) % 3;
给出-2。int result = (-3) % 5;
给出-3。通常,int result = (-a) % b;
在| -a |时给出正确的答案 > b。为了获得适当的结果,当| -a | <b我们应该包裹除数。int result = ((-a) % b) + b;
表示负数a或int result = (((-a) % b) + b) % b;
表示正数或负数
对于Java,您的结果是错误的。请提供一些上下文信息(您的程序,实现和Java版本)。
来自Java语言规范
15.17.3余数运算符%
[...]
对于二进制二进制数提升后的整数(第5.6.2节)的操作数,其余数运算会产生结果值,使得(a / b)* b +(a%b)等于一个。
15.17.2除法运算符/
[...]
整数除法轮朝向0。
由于/被四舍五入为零(结果为零),因此在这种情况下%的结果应为负。
int result = (-5) % 3;
给-2 int result = (-3) % 5;
给-3通常,int result = (-a) % b;
当| -a |时给出正确的答案 > b为了在| -a |时获得正确的结果 <b我们应该包裹除数。int result = ((-a) % b) + b;
为负a或int result = (((-a) % b) + b) % b;
为正a或负a。
(-3) % 5
,根据定义的正确结果是-3
,并且Java的正确实现应产生该结果。
(-3)%5
确实给出-3
,并且如果我们想要正余数,则应在其上加上5,然后结果将是2
您可以使用
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
。(尽管您可能更
[0, sign(divisor) * divisor)
而不是的范围内时,我的代码很有帮助[0, sign(dividend) * divisor)
。
您的答案在维基百科中: 模运算
它说,在Java中,模运算的符号与除数的符号相同。并且由于我们在谈论其余的除法运算就很好了,因此在您的情况下,由于-13/64 = 0,它会返回-13。-13-0 = -13。
编辑:对不起,您的问题误会了...您是对的,Java应该给出-13。您能否提供更多周围的代码?
x = x + m = x - m
模数m
。
因此-13 = -13 + 64
在模数64
和-13 = 51
模数方面64
。
假设Z = X * d + r
,如果0 < r < X
然后除法,Z/X
我们称为r
余数。
Z % X
返回的余数Z/X
。
mod函数的定义是一个数字超出除数的最大整数倍(不大于该数字)的数量。所以在你的情况下
-13 % 64
不超过-13的64的最大整数倍是-64。现在,当您从-64减去-13时等于51-13 - (-64) = -13 + 64 = 51
在Java最新版本中,您将获得-13%64 = -13
。答案将始终带有分子符号。
我不认为Java在这种情况下会返回51。我在Mac上运行Java 8,得到:
-13 % 64 = -13
程序:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}