BigDecimal解决精度丢失问题

在一些需要精确计算的情况下,常规的计算方法可能达不到要求,这个时候我们可以考虑使用BigDecimal,这里就只记录下其使用情况

BigDecimal有很多的构造函数,我们要选择哪一种呢

public class test {

	public static void main(String[] args) {
		System.out.println("普通的计算:");
		System.out.println(1.00100*1000);

		System.out.println("BigDecimal的double构造方法计算:");
		BigDecimal a1 = new BigDecimal(1.00100);
		BigDecimal a2 = new BigDecimal(1000);
		System.out.println(a1.add(a2));
		System.out.println(a1.multiply(a2));
		
		System.out.println("BigDecimal的String构造方法计算:");
		BigDecimal b1 = new BigDecimal(Double.toString(1.00100));
		BigDecimal b2 = new BigDecimal(Double.toString(1000));
		System.out.println(b1.add(b2));
		System.out.println(b1.multiply(b2));
	}
}

由上面可以看出我们应该使用其String的构造,但很多时候我们往数据库里面存放的是Double类型的数据,这时候就需要我们对其BigDecimal的加减乘除操作进行封装了

package com.zzmall.util;

import java.math.BigDecimal;

/**
 * Created by zz on 2018/5/13.
 */
public class BigDecimalUtil {

    //使用BigDecimal进行精度计算的时候一定要使用其String构造器
    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/zz0129/article/details/80864834