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异常
相关推荐
渔民小镇几秒前
一次编写到处对接 —— 为 Godot/Unity/React 生成统一交互接口
java·分布式·游戏·unity·godot
charlie1145141911 分钟前
嵌入式Linux模块开发——struct module 深度解析:内核模块的核心数据结构
linux·开发语言·数据结构·c
路ZP2 分钟前
放大镜下拉框
java·数据库·sql
愈努力俞幸运5 分钟前
docker入门,容器,镜像
java·分布式·docker
吴声子夜歌6 分钟前
ES6——Symbol详解
开发语言·javascript·es6
摇曳的精灵7 分钟前
Spring boot注解实现信息脱敏
java·spring boot·后端·注解脱敏·信息脱敏
星辰徐哥7 分钟前
C语言运算符的优先级与结合性详解
c语言·开发语言
weixin_704266057 分钟前
项目总结一
java·前端·spring boot·后端·spring
HZ·湘怡7 分钟前
顺序表 2 续集 c 实现增删查改
c语言·开发语言·顺序表
han_hanker8 分钟前
js 加减乘除精度问题2
开发语言·javascript·ecmascript