使用方式
在阿里巴巴《Java 开发手册》中提到,为了防止精度损失,禁止使用构造方法 BigDecimal(double) 的方式把 double 值转化为 BigDecimal 对象。BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。如:BigDecimal g = new BigDecimal(0.1f); 实际的存储值为:0.10000000149
优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了 Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。
BigDecimal recommend1 = new BigDecimal("0.1");
BigDecimal recommend2 = BigDecimal.valueOf(0.1);
BigDecima 常用 API
public BigDecimal add(BigDecimal b):加法public BigDecimal subtract(BigDecimal b):减法public BigDecimal multiply(BigDecimal b):乘法public BigDecimal divide(BigDecimal b):除法public BigDecimal divide (BigDecimal b,精确几位,舍入模式):除法
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c);
// 包装浮点型数据成为大数据对象 BigDeciaml
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
BigDecimal c1 = a1.add(b1);
// BigDecimal c1 = a1.subtract(b1);
// BigDecimal c1 = a1.multiply(b1);
// BigDecimal c1 = a1.divide(b1);
System.out.println(c1);
// 将 BigDecimal 转换为 double
double rs = c1.doubleValue();
System.out.println(rs);
// 注意事项:BigDecimal 是一定要精度运算的, 产生无限小数会报错
BigDecimal a11 = BigDecimal.valueOf(10.0);
BigDecimal b11 = BigDecimal.valueOf(3.0);
// 参数一:除数 参数二:保留小数位数 参数三:舍入模式
BigDecimal c11 = a11.divide(b11, 2, RoundingMode.HALF_UP); // 3.3333333333
System.out.println(c11);
