RoundingMode 是 Java 中用于控制舍入行为 的枚举类,位于 java.math 包中。它常与 BigDecimal、DecimalFormat 等高精度数值处理类一起使用,以明确指定在精度不足或需要截断时应如何舍入。
一、RoundingMode 枚举值(共 8 种)
| 枚举常量 | 说明 | 对应的舍入规则(以正数为例) |
|---|---|---|
UP |
远离零方向舍入 | 1.1 → 2,1.9 → 2,-1.1 → -2 |
DOWN |
向零方向舍入(截断) | 1.9 → 1,-1.9 → -1 |
CEILING |
向正无穷方向舍入 | 正数同 UP,负数同 DOWN |
FLOOR |
向负无穷方向舍入 | 正数同 DOWN,负数同 UP |
HALF_UP |
四舍五入(最常用) | 1.5 → 2,1.4 → 1,-1.5 → -2 |
HALF_DOWN |
五舍六入 | 1.5 → 1,1.6 → 2,-1.5 → -1 |
HALF_EVEN |
银行家舍入法(四舍六入五成双) | 1.5 → 2,2.5 → 2,3.5 → 4(使结果为偶数) |
UNNECESSARY |
不需要舍入,若需舍入则抛出 ArithmeticException |
仅用于精确计算,如 1.00 保留两位小数没问题,但 1.01 保留一位会报错 |
⚠️ 注意:
HALF_UP是我们日常说的"四舍五入",而HALF_EVEN是 IEEE 754 推荐的标准舍入方式,可减少累积误差。
二、示例
java
import java.math.BigDecimal;
import java.math.RoundingMode;
public class RoundingModeTest {
public static void main(String[] args) {
BigDecimal value = new BigDecimal("2.555");
// RoundingMode.UP 指定位向上取整
System.out.println("RoundingMode.UP 指定位向上取整");
System.out.println(value.setScale(0,RoundingMode.UP));
System.out.println(value.setScale(1,RoundingMode.UP));
// RoundingMode.UP 指定位向下取整
System.out.println("RoundingMode.DOWN 指定位向下取整");
System.out.println(value.setScale(0,RoundingMode.DOWN));
System.out.println(value.setScale(1,RoundingMode.DOWN));
// RoundingMode.CEILING 指定位向最近整数取整,如果距离两边一样远,则向上取整
System.out.println("RoundingMode.CEILING 指定位向最近整数取整,如果距离两边一样远,则向上取整");
System.out.println(value.setScale(0,RoundingMode.CEILING));
System.out.println(value.setScale(1,RoundingMode.CEILING));
System.out.println(value.setScale(2,RoundingMode.CEILING));
// RoundingMode.FLOOR 指定位向最近整数取整,如果距离两边一样远,则向下取整
System.out.println("RoundingMode.FLOOR 指定位向最近整数取整,如果距离两边一样远,则向下取整");
System.out.println(value.setScale(0,RoundingMode.FLOOR));
System.out.println(value.setScale(1,RoundingMode.FLOOR));
System.out.println(value.setScale(2,RoundingMode.FLOOR));
// RoundingMode.HALF_UP 四舍五入
System.out.println("RoundingMode.HALF_UP 四舍五入");
System.out.println(value.setScale(0,RoundingMode.HALF_UP));
System.out.println(value.setScale(1,RoundingMode.HALF_UP));
System.out.println(value.setScale(2,RoundingMode.HALF_UP));
// RoundingMode.HALF_DOWN 五舍六入
System.out.println("RoundingMode.HALF_DOWN 五舍六入");
System.out.println(value.setScale(0,RoundingMode.HALF_DOWN));
System.out.println(value.setScale(1,RoundingMode.HALF_DOWN));
System.out.println(value.setScale(2,RoundingMode.HALF_DOWN));
// RoundingMode.HALF_EVEN 银行家舍入,四舍六入,五成双,看前一位
System.out.println("RoundingMode.HALF_EVEN 银行家舍入,四舍六入,五成双,看前一位");
System.out.println(value.setScale(0,RoundingMode.HALF_EVEN));
System.out.println(value.setScale(1,RoundingMode.HALF_EVEN));
System.out.println(value.setScale(2,RoundingMode.HALF_EVEN));
// RoundingMode.UNNECESSARY 不进行舍入,如果舍入位不为0,则抛出ArithmeticException异常
System.out.println("RoundingMode.UNNECESSARY 不进行舍入,如果舍入位不为0,则抛出ArithmeticException异常");
}
}
txt
RoundingMode.UP 指定位向上取整
3
2.6
RoundingMode.DOWN 指定位向下取整
2
2.5
RoundingMode.CEILING 指定位向最近整数取整,如果距离两边一样远,则向上取整
3
2.6
2.56
RoundingMode.FLOOR 指定位向最近整数取整,如果距离两边一样远,则向下取整
2
2.5
2.55
RoundingMode.HALF_UP 四舍五入
3
2.6
2.56
RoundingMode.HALF_DOWN 五舍六入
3
2.6
2.55
RoundingMode.HALF_EVEN 银行家舍入,四舍六入,五成双,看前一位
3
2.6
2.56
RoundingMode.UNNECESSARY 不进行舍入,如果舍入位不为0,则抛出ArithmeticException异常