bigdecimal.roundingmode.half_even是银行家舍入法的标准实现,向最近偶数舍入以消除统计偏差;规则为:恰好0.5时看保留位奇偶性,偶则舍、奇则入,后续非零则直接进位。

BigDecimal.RoundingMode.HALF_EVEN 就是银行家舍入法的标准实现,Java 内置支持,无需手动编码。它在四舍五入时对“恰好为 0.5”的情况,向**最近的偶数**舍入,以减少统计偏差。
为什么叫“银行家舍入”?
传统“四舍五入”(HALF_UP)长期使用会导致结果系统性偏高;而 HALF_EVEN 在大量数据中让舍入误差正负抵消,更公平——银行、财务、科学计算等场景要求这种无偏性。
例如:对一位小数舍入时:
- 1.5 → 2(2 是偶数)
- 2.5 → 2(2 是偶数)
- 3.5 → 4(4 是偶数)
- 4.5 → 4(4 是偶数)
HALF_EVEN 的具体规则
假设要保留 n 位小数,看第 n+1 位及之后的值:
- 如果第 n+1 位
- 如果第 n+1 位 > 5 → 进位(向上)
- 如果第 n+1 位 == 5,且后面全为 0 → 看第 n 位数字的奇偶性:
→ 若第 n 位是偶数(0,2,4,6,8),则舍去(保持偶数)
→ 若第 n 位是奇数(1,3,5,7,9),则进位(使结果变为偶数) - 如果第 n+1 位 == 5,但后面还有非零数字(如 0.1251)→ 视为 >0.5,直接进位
代码示例:验证 HALF_EVEN 行为
以下用 scale = 0(即取整)演示:
BigDecimal a = new BigDecimal("2.5"); // → 2
BigDecimal b = new BigDecimal("3.5"); // → 4
BigDecimal c = new BigDecimal("4.5"); // → 4
BigDecimal d = new BigDecimal("5.5"); // → 6
BigDecimal e = new BigDecimal("1.25"); // scale=1 → 1.2(因为 2 是偶数)
BigDecimal f = new BigDecimal("1.35"); // scale=1 → 1.4(因为 3 是奇数,进成偶数 4)
BigDecimal g = new BigDecimal("1.251"); // scale=1 → 1.3(因 0.051 > 0.05,进位)
调用方式统一为:value.setScale(保留小数位数, RoundingMode.HALF_EVEN)
注意事项
- HALF_EVEN 对 整数部分同样适用(如 125 → 120 或 130,取决于十位奇偶)
- 它只在“恰好等于半单位”且后续无精度损失时才触发偶数判断;一旦存在更低位非零数,就按常规向上取整
- 不要和浮点数(double/float)混用:先用字符串构造 BigDecimal,避免二进制浮点误差污染舍入逻辑
- 比如
new BigDecimal(0.1 + 0.2)≠new BigDecimal("0.3"),应写成new BigDecimal("0.3")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











