如何对BigDecimal数值的小数点前指定位数执行商业四舍五入
最优简洁实现
直接链式调用两次setScale即可,无需中间转字符串再构造对象:
var b = a.setScale(-2, RoundingMode.HALF_UP).setScale(2);
逻辑说明
- 第一次
setScale(-2, RoundingMode.HALF_UP):完成商业四舍五入到百位(小数点前两位)的逻辑,以你给出的示例a = new BigDecimal("1234.56")为例,这一步会得到值为1200、精度为0的BigDecimal对象 - 第二次
setScale(2):直接将上一步得到的整数值补充两位小数的后缀零,调整小数位为2位,不需要额外舍入规则,不会抛出算术异常,最终得到值为1200.00、精度为2的BigDecimal对象,完全满足new BigDecimal("1200.00").equals(b)的判断条件
原写法的问题
你原来的实现中转字符串再构造new BigDecimal(xxx.toPlainString())属于完全冗余的操作,不仅增加代码复杂度,还会带来不必要的性能损耗,直接链式调用setScale就可以达到完全相同的效果。
内容的提问来源于stack exchange,提问作者peer
相关产品推荐
相关产品推荐

