stripTrailingZeros仅去除小数部分末尾无效零并调整标度,不改变数值和精度;返回新BigDecimal对象,需链式调用toPlainString()获取无科学计数法的干净字符串。

stripTrailingZeros 是 BigDecimal 提供的专门用于去除末尾无效零的方法,它不会改变数值大小,只优化表示形式。
它到底去掉哪些零?
只去掉小数部分末尾的 0(即不影响精度的冗余零),整数部分的零不处理;同时会自动调整标度(scale),让结果更紧凑:
-
new BigDecimal("123.4500") → "123.45"(scale 从 4 变为 2) -
new BigDecimal("100.00") → "100"(scale 从 2 变为 0,变成整数形式) -
new BigDecimal("0.000") → "0"(全零时返回 scale=0 的 0) -
new BigDecimal("12300") → "12300"(整数无小数点,不变化)
和 toPlainString() 配合使用效果更好
stripTrailingZeros 返回的仍是 BigDecimal,若要获得干净字符串(不含科学计数法、无多余零),建议链式调用:
bd.stripTrailingZeros().toPlainString()- 避免直接用
toString(),因为它可能返回科学计数法(如"1E+5") - 例如:
new BigDecimal("100000.00").stripTrailingZeros().toPlainString()→"100000"
注意不可变性与原对象无关
stripTrailingZeros 返回新对象,原 BigDecimal 不变:
立即学习“Java免费学习笔记(深入)”;
- 必须接收返回值:
BigDecimal clean = bd.stripTrailingZeros(); - 写成
bd.stripTrailingZeros();不做赋值,等于没用 - 它不修改原始实例,符合
BigDecimal所有操作的不可变设计原则
和 round() 或 setScale() 不是一回事
它不是四舍五入,也不改变精度,只是规范化表示:
-
stripTrailingZeros:纯格式整理,无计算、无舍入 -
setScale(2, RoundingMode.HALF_UP):强制保留两位小数,可能舍入 - 混淆使用会导致意外结果,比如对
"1.234"调用stripTrailingZeros没变化,但setScale(2)会变成"1.23"


















