Java 负数的模运算符不正确
我对Java模函数有一个问题 由于某种原因,当计算机应等于23时,计算机的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)。根据这个定义,当
-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余数运算符的正确工作方式。你的期望是错误的。