roundingmode.floor是向负无穷方向舍入,即取小于等于原值的最大整数:3.7→3,-3.7→-4;区别于down(向零截断),对负数结果不同,金融计算中需谨慎选用。

RoundingMode.FLOOR 在 BigDecimal 中实现的是“向负无穷方向舍入”,不是简单地去掉小数部分(即不等同于数学上的“向下取整”对所有数都成立),而是严格按数值大小朝更小的方向取整——对正数是向下截断,对负数是更进一步向下(即更负)。
理解 FLOOR 的真实含义
FLOOR 不是“去掉小数”,而是找**小于等于原值的最大整数**(即数学中的 floor 函数)。例如:
-
new BigDecimal("3.7").setScale(0, RoundingMode.FLOOR)→3(3 ≤ 3.7,且是满足条件的最大整数) -
new BigDecimal("-3.7").setScale(0, RoundingMode.FLOOR)→-4(-4 ≤ -3.7,而 -3 > -3.7,不满足 ≤ 条件) -
new BigDecimal("5.0").setScale(0, RoundingMode.FLOOR)→5
正确使用 setScale 实现 FLOOR 舍入
必须指定保留的小数位数(通常为 0 表示取整),并显式传入 RoundingMode.FLOOR:
- 要得到整数结果:调用
setScale(0, RoundingMode.FLOOR) - 要保留 1 位小数并向下舍入:用
setScale(1, RoundingMode.FLOOR) - 注意:setScale 会改变精度,若原值小数位数不足,FLOOR 不会补零;若超过,则按规则舍去多余位
与其它模式的对比(避免混淆)
FLOOR 容易和以下模式弄混:
-
DOWN:直接截断小数(向零靠近),
-3.7 → -3 -
FLOOR:向负无穷,
-3.7 → -4 -
CEILING:向正无穷,
-3.7 → -3,3.7 → 4 - HALF_DOWN 等:基于四舍五入逻辑,与 FLOOR 无关
实际编码注意事项
使用时需留意几点:
- setScale 要求目标精度 ≥ 0,否则抛
ArithmeticException - 如果只想获取整数部分(类似 Math.floor(double)),FLOOR 是最准确的选择,尤其在金融计算中需避免向零截断带来的偏差
- 对正数而言,FLOOR 和 DOWN 效果一致;但对负数,二者结果不同,务必根据业务语义选择
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











