BigDecimal(double)存在精度损失风险
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 的实际能表达的精度对尾数进行了截断。