Java的RoundingMode舍入模式

RoundingMode 是 Java 中用于控制舍入行为 的枚举类,位于 java.math 包中。它常与 BigDecimalDecimalFormat 等高精度数值处理类一起使用,以明确指定在精度不足或需要截断时应如何舍入。


一、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异常
相关推荐
小努蛋4 分钟前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
风流 少年8 分钟前
Spring AI 2.0:MCP
java·后端·spring
qz_Serene18 分钟前
C++:类和对象(上)
开发语言·c++
天疆说36 分钟前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
西安景驰电子1 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php
ctlover1 小时前
Python文件操作
开发语言·python
luj_17681 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
水无痕simon1 小时前
3 短信应用场景以及平台架构
java·服务器
mister_guo1 小时前
JVM 内存管理原理及生产配置实战:从“参数能启动”到“内存可控”
java·jvm