BigDecimal加减乘除计算
BigDecimal有多种构造函数,常用的有2种。建议使用String构造方式,不建议使用double构造方式。
// 强制使用String的构造函数,double也有可能计算不太准确
// 原则是使用BigDecimal并且一定要用String来构造。
public BigDecimal(String val);
public BigDecimal(double val);
在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。对Bigdecimal类型值进行加减乘除绝对值的运算,其实就是Bigdecimal的类方法的一些调用。
加法:add()函数
减法:subtract()函数
乘法:multiply()函数
除法:divide()函数
绝对值:abs()函数
BigDecimal valueSec = new BigDecimal(1000000);
BigDecimal valueThi = new BigDecimal(-1000000);
//尽量用字符串的形式初始化
BigDecimal stringFir = new BigDecimal("0.005");
BigDecimal stringSec = new BigDecimal("1000000");
BigDecimal stringThi = new BigDecimal("-1000000");
//加法
BigDecimal addVal = valueFir.add(valueSec);
System.out.println("加法用value结果:" + addVal);
BigDecimal addStr = stringFir.add(stringSec);
System.out.println("加法用string结果:" + addStr);
//减法
BigDecimal subtractVal = valueFir.subtract(valueSec);
System.out.println("减法value结果:" + subtractVal);
BigDecimal subtractStr = stringFir.subtract(stringSec);
System.out.println("减法用string结果:" + subtractStr);
//乘法
BigDecimal multiplyVal = valueFir.multiply(valueSec);
System.out.println("乘法用value结果:" + multiplyVal);
BigDecimal multiplyStr = stringFir.multiply(stringSec);
System.out.println("乘法用string结果:" + multiplyStr);
//绝对值
BigDecimal absVal = valueThi.abs();
System.out.println("绝对值用value结果:" + absVal);
BigDecimal absStr = stringThi.abs();
System.out.println("绝对值用string结果:" + absStr);
//除法
BigDecimal divideVal = valueSec.divide(valueFir, 20, BigDecimal.ROUND_HALF_UP);
System.out.println("除法用value结果:" + divideVal);
BigDecimal divideStr = stringSec.divide(stringFir, 20, BigDecimal.ROUND_HALF_UP);
System.out.println("除法用string结果:" + divideStr);
}
根据结果,初始化建议使用String:
注意
System.out.println()中的数字默认是double类型的,double类型小数计算不精准。
使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的。
因为不是所有的浮点数都能够被精确的表示成一个double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。