我的模数做错了吗?因为在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 % yA)如果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);
}
}