Java 一个数字的模总是在0和它的数字-1之间返回?
我需要对一个数进行MOD,它是一个Java 一个数字的模总是在0和它的数字-1之间返回?,java,compiler-construction,modulus,Java,Compiler Construction,Modulus,我需要对一个数进行MOD,它是一个长数据类型 类似这样的事情- number % 1965 上述模数结果是否始终在0和1964范围内 或者在某些情况下,它不会返回0到1664之间的任何数字 我正在使用Java作为编程语言,我将在Ubuntu机器上运行我的程序 起初我认为这是一个数学问题,但主要取决于编译器和语言。。。所以有点困惑,它总是返回0到1664之间的数字,或者有一些异常情况 这就是我的方法- private static int getPartitionNumber() { r
长数据类型
类似这样的事情-
number % 1965
上述模数结果是否始终在0
和1964
范围内
或者在某些情况下,它不会返回0到1664之间的任何数字
我正在使用Java作为编程语言,我将在Ubuntu机器上运行我的程序
起初我认为这是一个数学问题,但主要取决于编译器和语言。。。所以有点困惑,它总是返回0到1664之间的数字,或者有一些异常情况
这就是我的方法-
private static int getPartitionNumber() {
return (int) (number % 1965);
}
更新:
我忘了提到的一件事是,这里的
number
永远是正数。在程序开始时抛出的任何负数都是IllegalArgumentException。否,java的模数实现将返回一个范围(-n,n)
的值x%n
。也就是说,如果左操作数为负数,则结果将为负数。要解决此问题,请尝试以下方法:
((x % n) + n) % n;
它将返回范围[0,n)
编辑(以反映相关更新)
如果左操作数为正数,则只需
x%n
即可生成范围[0,n)
其中x>=0
如果number
是非负的,这在几乎所有语言中都是正确的。一些语言会为负数返回负数结果;我不确定Java中是否是这样。你确定需要强制转换吗?我认为模数总是返回整数,而不是floating@aliasm2k, 这里的数字是一个长数据类型
,所以我认为最好强制转换它?如果我错了,请纠正我?如果它编译时没有强制转换,您就不需要强制转换。@ChrisHayes在Java中,如果x
<0和y
<0,那么x%y
将是负数。的Wikipedia条目有一个很酷的图表,列出了这个操作的工作原理在88种不同的语言中。有些语言有两个不同处理负数的模运算符。谢谢。我忘记提到的一件事是,这里的number
将始终是正数。我抛出的任何负数都是IllegalArgumentException。正数也是这样吗?如果你能保证操作数(在上面的示例中,x
)为正,则x%n
的结果保证在[0,n)
范围内(不需要执行添加额外n
并取另一个模的位)。