解决丢失精度问题------------在购物车模块中经常遇到的问题

1.在电商项目中进行运算的时候,会出现一些丢失精度的问题,这是不允许的,一下是测试精度的一个小方法:
这里写图片描述
在控制台上输出的数据,精度有问题;

2.在effective java这本书中提到,float、double这些精度的计算只能用在科研领域中一些细小精度可以忽略的方面,在商业计算中一定是用BigDecimal,
BigDecimal一共有四个构造方法,


3.数据库中存储的是double、float经常进行转换的话会比较麻烦,所以写一个工具类这样方便:


package com.mmall.util;

import java.math.BigDecimal;

/**
* @program: mmall
* @description: 精度转换的一个工具
* @author: Hailong
* @create: 2018-08-02 09:15
**/
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);//四舍五入,保留两位小数
    //除不尽的情况
}

}

猜你喜欢

转载自blog.csdn.net/qq_41166135/article/details/81352499
今日推荐