BigDecimal(double)存在精度损失风险

发布时间 2023-07-12 14:20:35作者: 花田007
public static void main(String[] args) {
        //错误代码
        BigDecimal bigDecimal = new BigDecimal(0.11d);
        System.out.println(bigDecimal);
        //正确代码(下面两种都可以)
        BigDecimal bigDecimal2 = new BigDecimal("0.11");
        BigDecimal bigDecimal3 = BigDecimal.valueOf(0.11d);
        System.out.println(bigDecimal2);
        System.out.println(bigDecimal3);

        /**结果如下
         * 0.11000000000000000055511151231257827021181583404541015625
         * 0.11
         * 0.11
         */
    }

说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。

优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了 Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。