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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值