今天碰到一个代码上的坑,关于BigDecimal上四舍五入的问题。
BigDecimal num = new BigDecimal(0.245);
System.out.println( num.setScale(2,BigDecimal.ROUND_HALF_UP) );
问:为啥最后的结果是0.24而不是0.25?
一开始我也没看出为啥。于是亲自运行了一下代码,结果还真是0.24。知道我在四舍五入之前把num的值打出来看了一下瞬间恍然大悟。
BigDecimal num = new BigDecimal(0.245);
System.out.println( num );
System.out.println( num.setScale(2,BigDecimal.ROUND_HALF_UP) );
原因在于BigDecimal类型的num在实例化的时候使用的参数0.245他没有加引号,所以这个0.245其实默认是个double类型,而double的类型本身就不精确,于是他在变成BigDecimal类型的时候,值还是不精确,所以四舍五入的时候就错了。
所以在数值转成BigDecimal的时候切记要使用字符串的入参,否则可能就引发上述的错误了。