由于人们在四舍五入到整数的倍数时遇到这样的麻烦,无论是向上/向下/最近四舍五入,这里是非常简单的方法:
public static int roundDown(int value, int multiplier) {
return value / multiplier * multiplier;
}
public static int roundHalfUp(int value, int multiplier) {
return (value + multiplier / 2) / multiplier * multiplier;
}
public static int roundUp(int value, int multiplier) {
return (value + multiplier - 1) / multiplier * multiplier;
}
测试
Value Down Half Up
0 0 0 0
1 0 0 4
2 0 4 4
3 0 4 4
4 4 4 4
Value Down Half Up
0 0 0 0
1 0 0 5
2 0 0 5
3 0 5 5
4 0 5 5
5 5 5 5
负数
它们不适用于负数。 “向下舍入”通常意味着“向零”,不像 Math.floor() 向负无穷舍入。
这里有可以处理负值的版本。这些与BigDecimal 使用的类似名称的RoundingMode 选项一致。
public static int roundDown(int value, int multiplier) {
if (multiplier <= 0) throw new IllegalArgumentException();
return value / multiplier * multiplier;
}
public static int roundHalfUp(int value, int multiplier) {
if (multiplier <= 0) throw new IllegalArgumentException();
return (value + (value < 0 ? multiplier / -2 : multiplier / 2)) / multiplier * multiplier;
}
public static int roundUp(int value, int multiplier) {
if (multiplier <= 0) throw new IllegalArgumentException();
return (value + (value < 0 ? 1 - multiplier : multiplier - 1)) / multiplier * multiplier;
}
测试
Value Down Half Up
-4 -4 -4 -4
-3 0 -4 -4
-2 0 -4 -4
-1 0 0 -4
0 0 0 0
1 0 0 4
2 0 4 4
3 0 4 4
4 4 4 4
Value Down Half Up
-5 -5 -5 -5
-4 0 -5 -5
-3 0 -5 -5
-2 0 0 -5
-1 0 0 -5
0 0 0 0
1 0 0 5
2 0 0 5
3 0 5 5
4 0 5 5
5 5 5 5