解决java中丢失精度问题

解决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位小数
    }
}

你可能感兴趣的:(java)