BigDecimal使用中踩过的坑

    xiaoxiao2025-03-18  35

    实际项目涉及支付金额相关经常会使用BigDecimal,在使用过程中踩过坑:

    (1)BigDecimal做除法运算时一定要指定精度,如:

    BigDecimal bg1 = BigDecimal.valueOf(1D); BigDecimal bg2 = BigDecimal.valueOf(2D); BigDecimal value = bg1.divide(bg2); System.out.println(value);

    这段代码执行输出0.5,没有任何问题;只需要将上面代码第二行更改为:

    BigDecimal bg2 = BigDecimal.valueOf(3D);

    执行后会出现如下错误:

    Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(BigDecimal.java:1690)

    如果除法运算的结果是一个无限循环小数,本例中1除以3,等于0.333333......,BigDecimal默认是保存所有精度的,精度趋于无穷,会出错;

    【可以查看BigDecimal源码】

    应该写成:

    BigDecimal bg1 = BigDecimal.valueOf(1D); BigDecimal bg2 = BigDecimal.valueOf(3D); BigDecimal value = bg1.divide(bg2, 10 , RoundingMode.CEILING);//后2个参数可以根据实际需求情况确定 System.out.println(value);//输出0.3333333334

    这个坑,如果开发后,测试人员覆盖案例少带到生产上还是会有很大隐患的;

    (2)另一个一般技术思维会犯的错,

    BigDecimal bg3 = BigDecimal.valueOf(1D); BigDecimal bg4 = BigDecimal.valueOf(3D); bg3.add(bg4); System.out.println(bg3);

    第一反应bg3理所当然值应该为4,其实真实输出结果是1;

    正确的写法:

    BigDecimal bg3 = BigDecimal.valueOf(1D); BigDecimal bg4 = BigDecimal.valueOf(3D); bg3 = bg3.add(bg4); System.out.println(bg3);//输出4.0

    查看BigDecimal源码,了解到结果是放到了add的返回值中,参与计算的值并不会发生变化。

    这个问题在技术开发单元测试一般都会排查出来。

    以上是我遇到的,大家有遇到的情况可以回复交流。

    另外看到有人也犯过其他的坑,放个链接在这里:

    https://blog.csdn.net/song19890528/article/details/76771943/

    最新回复(0)