介绍
我们之前做的民生银行的培训系统时大量的用到了BigDecimal用于计算学分和金额等数据,那为什么这类数据不用double而是用Bigdecimal,接下来进行小结一下
Bigdecimal是java.math包下的一个类,不可变的、任意精度的有符号十进制数,BigDecimal类使用户能完全控制舍入行为,如果需要精确计算的结果,则必须使用BigDecimal
BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法
说明:equals()方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo()则会忽略精度
@Test
public void bigDecimal1(){
BigDecimal h = new BigDecimal("0.00");
BigDecimal k = BigDecimal.ZERO;
System.out.println(h.compareTo(k)==0);
System.out.println(h.equals(k));
}
输出结果:
true
false
BigDicimal的加减乘除
@Test
public void bigDecimal(){
BigDecimal a = new BigDecimal("2.12");
BigDecimal b = new BigDecimal("0.2");
//加法
BigDecimal c = a.add(b);
// 减法
BigDecimal d = a.subtract(b);
// 乘法
BigDecimal e = a.multiply(b);
double ff = e.doubleValue(); // 转换成double类型的值
// 除法,
BigDecimal f = a.divide(b);
}
注意点:如果new new BigDecimal(1.0);中的值是int类型,那么计算出来也是有问题的见以下案例
@Test
public void bigDecimal1(){
BigDecimal h = new BigDecimal(1.0);
BigDecimal k = new BigDecimal(0.9);
BigDecimal test = h.subtract(k);
System.out.println(test);
}
输出的值为:0.09999999999999997779553950749686919152736663818359375
两个BigDecimal值如果除不尽就会报错,见截图
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);
用double进行小数的加减乘除会有什么问题
@Test
public void doubleTest(){
double a = 1.0;
double b = 0.9;
double c = a - b;
System.out.println(c);
}
得出的结果为:0.09999999999999998 应该得出的值为0.1这里得出的是一个近似0.1的值
评论区