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 推荐的标准舍入方式,可减少累积误差。


二、示例

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异常
相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++