首先看下java 处理精度问题的一个问题,如下图:
这是java处理的加减乘除的测试类,可以看出问题不正常,当我I们在计算精度问题的时候,就会出现进度丢失的问题!
看下BigDecimal处理这些加减乘除问题如下为如所示:
结果显示精度丢失更加严重,按道理来说应该不会出现这样问题,出现这个问题的原因是什么? 接下来看第三个demo如下图
这样情况就很明显了,是我们想要的结果,使用的是String的BigDecimal构造器计算结果,所以在我们选择计算金额时候一定要选择String的构造器,问题来了 为什么要选择String构造函数进行加减运算;看下源码都知到
意思是在用的时候需要将Double类型转为String类型构造器在商业用途中!
这里提供一个BigDecimal的工具类,可以省去在精度计算的时候类型间互相转换的问题(比较拙劣,仅供参考);
/**
* Created by :Corey
* 14:24 2019/1/2
* BigDecimal 计算工具了
*/
public class BigDecimalUtils {
private BigDecimalUtils() {
}
/**
* 加法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
/**
* 减法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
/**
* 乘法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
/**
* 除法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal div(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, BigDecimal.ROUND_HALF_UP);//四舍五入
}
}