Java中的RoundingMode舍入模式详解
作者:lagrahhn
Java中的RoundingMode枚举类用于控制高精度数值处理时的舍入行为,提供多种舍入模式,本文给大家介绍Java的RoundingMode舍入模式,感兴趣的朋友跟随小编一起看看吧
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 推荐的标准舍入方式,可减少累积误差。
二、示例
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异常");
}
}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异常
到此这篇关于Java中的RoundingMode舍入模式详解的文章就介绍到这了,更多相关java roundingmode舍入模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
