Java中BigDecimal解决精度丢失问题

 

1.我们先看一个例子

Java中BigDecimal解决精度丢失问题_第1张图片

可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有0.06元,却无法购买一个0.05元和一个0.01元的商品。因为如上所示,他们两个的总和为0.060000000000000005。这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。可能会导致无法下单,或者对账出现问题。所以接下来我们就可以使用Java中的BigDecimal类来解决这类问题。

2.BigDecimal中的一些方法

构造器                   描述                      
  BigDecimal(int)       创建一个具有参数所指定整数值的对象。      
  BigDecimal(double)    创建一个具有参数所指定双精度值的对象。     
  BigDecimal(long)      创建一个具有参数所指定长整数值的对象。     
  BigDecimal(String)    创建一个具有参数所指定以字符串表示的数值的对象。
方法                    描述                         
  add(BigDecimal)       BigDecimal对象中的值相加,然后返回这个对象。
  subtract(BigDecimal)  BigDecimal对象中的值相减,然后返回这个对象。
  multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。
  divide(BigDecimal)    BigDecimal对象中的值相除,然后返回这个对象。
  toString()            将BigDecimal对象的数值转换成字符串。    
  doubleValue()         将BigDecimal对象中的值以双精度数返回。   
  floatValue()          将BigDecimal对象中的值以单精度数返回。   
  longValue()           将BigDecimal对象中的值以长整数返回。    
  intValue()            将BigDecimal对象中的值以整数返回。

3.值得注意的是如果要想无精度丢失的情况下计算结果,那么需要把double,float类型的参数转化为String类型的。并且使用BigDecimal(String)这个构造方法进行构造。 去获取结果。不然还是没有效果。

(1)

Java中BigDecimal解决精度丢失问题_第2张图片

 (2)

Java中BigDecimal解决精度丢失问题_第3张图片

4.在一般开发过程中,我们数据库中存储的数据都是float和double类型的。在进行拿来拿去运算的时候还需要不断的转化,这样十分的不方便。这里我写了一个工具类,以后可以直接使用。

 

public class BigDecimalUtil {

    private BigDecimalUtil() {

    }

    public static BigDecimal add(double v1, double v2) {
        // v1 + 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) {
        //v1-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) {
        //v1*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) {
        //v1/v2
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        // 2 = 保留小数点后两位   ROUND_HALF_UP = 四舍五入
        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);// 应对除不尽的情况
    }
}

 

你可能感兴趣的:(java)