在一些需要精确计算的情况下,常规的计算方法可能达不到要求,这个时候我们可以考虑使用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); } }