Java 一个数字的模总是在0和它的数字-1之间返回?

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

我需要对一个数进行MOD,它是一个
长数据类型

类似这样的事情-

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
并取另一个模的位)。