Java 负数的模运算符不正确

Java 负数的模运算符不正确,java,Java,我对Java模函数有一个问题 由于某种原因,当计算机应等于23时,计算机的-3%26等于-3,因为小于-3的26的最低倍数为-26,-3--26为23 另外,如果将26加到-3,这实际上是在增加模数0,那么结果应该不会改变,结果应该变成23。有人能解释为什么Java有-3%26==-3而不是23,以及如何解决这个问题吗?在模逻辑中,结果值应该是余数,以达到0。因此,当你说-3%26时,结果是-3加3等于0。数学家通常定义当整数a除以正的整数b为a-bq,其中商q为下限(a÷b)。根据这个定义,当

我对Java模函数有一个问题

由于某种原因,当计算机应等于23时,计算机的
-3%26
等于-3,因为小于-3的26的最低倍数为-26,
-3--26
为23


另外,如果将26加到-3,这实际上是在增加模数0,那么结果应该不会改变,结果应该变成23。有人能解释为什么Java有
-3%26==-3而不是23,以及如何解决这个问题吗?

在模逻辑中,结果值应该是余数,以达到0。因此,当你说-3%26时,结果是-3加3等于0。

数学家通常定义当整数
a
除以正的整数
b
a-bq
,其中商
q
下限(a÷b)
。根据这个定义,当
-3
除以
26
时,余数是
23
,正如您所说的那样

然而,Java编程语言对余数的定义不同。取而代之的是使用
floor
(即向负无穷大取整),取整是向零进行的。这不会改变正值的答案,但对于负值
a
和正值
b
而言,Java的答案小于数学家的答案(除非
b
精确地划分为
a
,在这种情况下,所有人都同意答案是
0
)。因此
-3%26==23-26==3

Java程序员通常调用
%
余数运算符,但您可以正确地看到,它通常也被称为模运算符。在VisualBasic中,它甚至被编写成
Mod
,但其工作原理与C/C#/Java等中的
%
相同

在我看来,向零舍入而不是负无穷大是一个错误,它只会让生活更艰难。例如,要测试一个整数
n
是否为奇数,您应该能够在(n%2==1)
时执行
,但这不起作用,因为如果
n
为负且为奇数,则答案为
-1
。我不知道它是先用哪种语言,但是C、C++、C和java重复了同样的错误。在我看来,正确进行整数除法的语言包括Python、Ruby和Haskell

在Java8中,已将方法添加到
Math
类中,用于除法,其中舍入为负无穷大而不是零。方法是

Math.floorDiv(int, int)
Math.floorMod(int, int)
Math.floorDiv(long, long)
Math.floorMod(long, long)

Math.floorMod(-3,26)
根据需要返回
23

模数对数字起作用,就好像它们没有签名一样。不,等等,什么?你还以为模会发生什么?为什么它与倍数有任何关系?在Java中,
%
是整数,而不是一个。它不是模数,也不是一个函数。中定义了Java余数运算符的正确工作方式。你的期望是错误的。