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的时候切记要使用字符串的入参,否则可能就引发上述的错误了。


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

维特丝(vetes)泡沫发蜡喷雾干胶定型弹力素羊毛卷男女保湿蓬松发胶 泡沫发蜡450ml+旅行装99ml
¥34.00
维特丝(vetes)一梳黑染发剂染发梳植物潮色显白遮盖白发自然清水纯黑发焗油男女梳炫彩 自然黑LW00
¥49.00
维特丝(vetes)染发笔遮白补染快速染发天然植物一次性染发棒 一次性染发棒黑色
¥46.00
维特丝 护发精油防毛躁清香玫瑰奇焕亮发干枯烫发卷发直发头发润发护发素男女士 滋养柔顺护发精油100ml
¥36.00