Java避坑之为什么BigDecimal四舍五入之后值是错误的

今天碰到一个代码上的坑,关于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的时候切记要使用字符串的入参,否则可能就引发上述的错误了。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍