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