Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Mod产生负数_Java_Math_Mod - Fatal编程技术网

Java中的Mod产生负数

Java中的Mod产生负数,java,math,mod,Java,Math,Mod,当我计算inti=-1%2时,我得到了Java中的-1。在Python中,我得到1作为-1%2的结果。 要在Java中使用模函数获得相同的行为,我必须做些什么?这里的问题是,在Python中,%运算符返回模,在Java中返回余数。这些函数为正参数提供相同的值,但对于负输入,模数始终返回正结果,而其余的则可能给出负结果。在中有关于它的更多信息 通过执行以下操作,可以找到正值: int i = (((-1 % 2) + 2) % 2) 或者这个: int i = -1 % 2; if (i<

当我计算
inti=-1%2
时,我得到了Java中的
-1
。在Python中,我得到
1
作为
-1%2
的结果。
要在Java中使用模函数获得相同的行为,我必须做些什么?

这里的问题是,在Python中,%运算符返回模,在Java中返回余数。这些函数为正参数提供相同的值,但对于负输入,模数始终返回正结果,而其余的则可能给出负结果。在中有关于它的更多信息

通过执行以下操作,可以找到正值:

int i = (((-1 % 2) + 2) % 2)
或者这个:

int i = -1 % 2;
if (i<0) i += 2;
inti=-1%2;

如果(i如果您需要
n%m
,则:

int i = (n < 0) ? (m - (abs(n) % m) ) %m : (n % m);

如果模数是2的幂,则可以使用位掩码:

int i = -1 & ~-2; // -1 MOD 2 is 1

相比之下,Pascal语言提供了两个运算符;REM采用分子符号(
x remy
is
x-(x DIV y)*y
,其中
x divy
TRUNC(x/y)
),MOD需要正分母并返回正结果。

您可以使用以下方法:

注:如果模值(此处
2
)为负值,则所有输出值也将为负值。:)

来源:

如果b>0:
int mod=(mod=a%b)<0?a+b:a;

不使用
%
运算符两次

@amit_gr-不,我相信它一般都有效-你是对的-我错了+1@Cachapa请提供一个例子来支持这一说法。我相信OP的解决方案已经是通用的,考虑到<代码>((-(3%)4)+%)4=1 < /代码>(预期的结果),还有<代码>((3%(4)+4)% 4)=3 < /代码>(也是预期结果)。它同时适用于正红利和负红利。@111假设整数的范围是[-8,7],((5%6)+6)%6=((5+6)%6)=(-5%6)=-5,但5%6应该是正的。用适当大的数字替换像536887296和1610612736这样的32位整数,显然第二种方法是更好的。@pgreze想象一下,如果
n=-1000
m=3
,正确的答案应该是
2
,但在你的公式中答案仍然是否定的。这个表达式对我不起作用。对于负值,我得到的是1:m之间的值,而不是预期的0:m-1,如n为正值的情况。andrewmu的解决方案按预期运行。等等,这实际上是一个重复的问题。它还有一个完美的答案@Val你提到的模n等价类:这个范围{0,1,2..n-1}对程序员来说是好的,但是{-n,n+1,n+2,-1}是等价的,并且有同样的存在权。毫无疑问,部分混淆源于我们对这个操作符的通俗名称“mod”(C族的遗留物?),当Java文档实际将其称为“余数”操作符()时,K&R C将
%
操作符定义为生成余数,但将其命名为模操作符。令人困惑的是,他说,无论是在计算还是在数学中,模运算都会产生余数。。。但也声称“n的整数模的数字范围是0到n− 1."!Java中没有模运算符。%是一个余数运算符。它的速度与使用两个%运算符的版本相比如何?这是一个好问题。我执行了很多过早的优化。我想它可以节省几个CPU周期。@Dice:如果你能很好地证明此解决方案优于当前接受的解决方案,这对浏览此问题的人来说是很有价值的。If
是否比
%
快取决于你的CPU和你提供给它的数据,由于分支预测--ifs如果条件具有可预测的模式,则速度会更快。这几乎肯定会较慢,因为它具有分支,除非您知道输入大部分为正。如果是随机的,那么分支预测惩罚将比大多数CPU上额外的余数计算花费更多的时钟周期。或者,如果您想根据int是否为负数有条件地添加值,请尝试
(maybeNegative>>31)^thingToMaybeAdd+thingToAddTo
int i = -1 & ~-2; // -1 MOD 2 is 1
Math.floorMod(-1, 2); //== 1
if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;