RoundingMode的解释
在 Java 的 BigDecimal
中,RoundingMode
是一个枚举类型,用于指定舍入模式(即四舍五入规则)。当你使用 setScale()
或其他需要进行小数位舍入的方法时,必须提供一个 RoundingMode
模式来控制如何处理多余的精度。
✅ RoundingMode.DOWN
解释
- 含义: 向零方向舍入(即截断多余的小数部分,不进行进位)。
- 适用场景: 例如金融业务中“只舍不入”的计费逻辑、计算折扣时防止多收用户费用。
- 示例:
1.2349 | → 1.23 |
1.2351 | → 1.23 |
-1.2351 | → -1.23 |
无论小数点后第三位是什么,都会被直接舍去。
📌 RoundingMode
支持的 8 种方式
以下是 Java 中 RoundingMode
枚举支持的所有舍入方式及其行为说明:
| 远离零方向舍入 |
,
|
| 向零方向舍入(截断) |
,
|
| 向正无穷方向舍入 |
,
|
| 向负无穷方向舍入 |
,
|
| 四舍五入 |
,
|
| 五舍六入(靠近零方向的五不进位) |
,
|
| 银行家舍入法(偶数优先) |
,
(如果前一位是偶数)<br>
(奇数则进位) |
| 不允许舍入,若存在多余位数抛异常 | 若设置
且有小数位超过两位,则会抛出 ArithmeticException |
🧠 推荐使用规范(来自项目记忆)
根据 [浮点数精度处理规范](file://D:\project\mall\scp-java\supplier-captcha\src\main\java\com\slodon\supplier\captcha\util\Config.java),在涉及金额、温度等关键数值时:
- 推荐使用
RoundingMode.DOWN
(避免因进位造成额外收费或误差累积) - 对于统计类数据可使用
RoundingMode.HALF_UP
(如展示用数据) - 禁止使用默认构造函数中的隐式舍入,应显式指定
RoundingMode
✅ 示例代码:不同舍入方式对比
import java.math.BigDecimal; import java.math.RoundingMode; public class RoundingExample { public static void main(String[] args) { BigDecimal value = new BigDecimal("1.265"); System.out.println("RoundingMode.DOWN: " + value.setScale(2, RoundingMode.DOWN)); System.out.println("RoundingMode.UP: " + value.setScale(2, RoundingMode.UP)); System.out.println("RoundingMode.HALF_UP: " + value.setScale(2, RoundingMode.HALF_UP)); System.out.println("RoundingMode.FLOOR: " + value.setScale(2, RoundingMode.FLOOR)); System.out.println("RoundingMode.CEILING: " + value.setScale(2, RoundingMode.CEILING)); System.out.println("RoundingMode.HALF_EVEN:" + value.setScale(2, RoundingMode.HALF_EVEN)); } }
输出:
RoundingMode.DOWN: 1.26 RoundingMode.UP: 1.27 RoundingMode.HALF_UP: 1.27 RoundingMode.FLOOR: 1.26 RoundingMode.CEILING: 1.27 RoundingMode.HALF_EVEN: 1.26
📋 总结
| ✅ 推荐 | 金融、计费、支付等对精度敏感场景 |
| ⚠️ 视情况 | 展示用途、非关键计算 |
| ⚠️ 视情况 | 统计类计算,避免系统性偏差 |
/
/
| ⚠️ 特殊场景 | 用于特定数学需求 |
| ✅ 关键验证 | 如果你期望输入无多余小数,可强制检查精度 |
如果你正在开发财务、计费模块,建议统一使用 RoundingMode.DOWN
来保证一致性与安全性。
知识分享,交天下朋友,扶你上马,送你一层,职业规划,面试指导、高薪谈判、背调辅助