其实针对BigDecimal的加减乘除几年前都熟练使用了,这次采坑了,之前一直遵循着一个常识:就是bigdecimal在计算的过程当中不进行四舍五入,直到最后计算完毕再对整体的计算结果进行四舍五入。 riskPricingResponse.getYearRate() 为 0.28 所以这次生产上的问题是:
原写法:
riskPricingResponse.getYearRate().divide(new BigDecimal("12"))
.multiply(new BigDecimal("100")).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()
这个写法自认为是没问题的,即使除不尽最后保留两位有效小数了。。
可惜还是一个错误打醒了固有的认知:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
所以代码优化成下面这个:
riskPricingResponse.getYearRate().divide(new BigDecimal("12"),4,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal("100")).setScale(2,BigDecimal.ROUND_UP).toPlainString()