解决java中丢失精度问题
在电商项目中遇到的问题,正常的float、double数据进行运算会出现精度丢失问题,在涉及货币计算时会出现严重后果。
代码:
System.out.println(0.03+0.0101);
System.out.println(1.0-0.52);
System.out.println(4.235*1000);
System.out.println(13.3/100);
结果:
0.0401
0.48
4235.0
0.133
解决的方式是使用BigDecimal的string构造函数。之所以要使用string构造函数是因为double类型的构造函数同样存在这个问题,这是由于JDK中double类型运算造成不确定的痼疾。
下面是用BigDecimal写的一个工具类解决这个问题 :
public class BigDecimalUtil {
private BigDecimalUtil(){
}
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);
}
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);
}
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);
}
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,2,BigDecimal.ROUND_HALF_UP); //四舍五入,保留2位小数
}
}