Java 模运算符%基于截断除法(参见维基百科:模运算)。
5%3产生2(注意5/3产生1)5%(-3)产生2(注意5/(-3)产生-1)(-5)%3产生-2(注意(-5)/3产生-1)(-5)%(-3)产生-2(注意(-5)/(-3)产生1)
在计算科学中,给定两个整数a并且n, > 0,有时获得与模一致n的唯一整数是有用r的。[a,n[an
问题
Java中是否有一个有效的通用运算符/方法尊重这个模数规范?
这是为了避免在每个需要它的项目中重写它......
各种各样的
我在stackoverflow上发现了很多关于这个问题的问题,其中大多数混淆了不同的模实现。如果您只是对负数的模运算结果感到困扰,下面是一些基于 Java%运算符的实现,它们可能有用。
常见的黑客
由于我们几乎不使用负除数,因此此实现在 时返回欧几里得或底模n > 0。
static int mod(int a, int n){
return a<0 ? (a%n + n)%n : a%n;
}
mod( 5, 3)生产2mod(-5, 3)生产1
欧几里得模
static int euclideanModulo(int a, int n){
return n<0 ? euclideanModulo(a, -n) : mod(a, n);
}
euclideanModulo( 5, 3)生产2euclideanModulo(-5, 3)生产1euclideanModulo( 5,-3)生产2euclideanModulo(-5,-3)生产1
底模
static int flooredModulo(int a, int n){
return n<0 ? -flooredModulo(-a, -n) : mod(a, n);
}
flooredModulo( 5, 3)生产2flooredModulo(-5, 3)生产1flooredModulo( 5,-3)生产-1flooredModulo(-5,-3)生产-2