在计算与金额有关的数据时,涉及到精度问题,所以建议使用BigDecimal。
一、BigDecimal转换的精度问题
BigDecimal num1=new BigDecimal(0.05);
BigDecimal num2=BigDecimal.valueOf(0.08);
在将double类型的数据转换为BigDecimal时,直接使用new BigDecimal() 的方式使用alibaba代码规范会提示如下。因为当数据比较精密时直接转换会造成精度丢失。float 浮点数类似。
二、BigDecimal的加减乘除
加法 add()函数 减法subtract()函数
乘法multipy()函数 除法divide()函数 绝对值abs()函数
BigDecimal res1=num1.add(num2);
BigDecimal res2=num1.subtract(num2);
//setScale() 设置小数点后面保留几位小数
BigDecimal res3= num1.multiply(num2).setScale(2,BigDecimal.ROUND_UP);
BigDecimal res4=num1.divide(num2,2,BigDecimal.ROUND_UP);
BigDecimal res5=num1.abs();
三、除法divide()参数使用
使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错
我们可以看到divide函数的源码参数
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
// BigDecimal divisor 除数,int scale 精度小数位,int roundingMode 舍入模式
具体舍入模式有8种,根据业务需求合理选择即可。这里就不一一解释。
四、BigDecimal比较大小
判断是否为0,使用前面一种方式返回false,后面一种方式返回true。这个地方本人还踩过坑。所以建议使用 coparaTo() 函数比较大小
//使用compareTo方法比较
//注意:两个比较的参数均不能为null,否则会报空指针
BigDecimal bigDecimal=new BigDecimal(String.valueOf(0.000000000000));
System.out.println(bigDecimal.equals(BigDecimal.ZERO));
System.out.println(bigDecimal.compareTo(BigDecimal.ZERO)==0);