使用BigDecimal(double val)构造器时,具有一定的不可预知性。当程序使用new BigDecimal(0.1)来创建一个BigDecimal对象时,它的值并不是0.1,它实际上等于一个近似0.1的数。
public class DoubleTest { public static void main(String args[]) { System.out.println("0.05 + 0.01 = " + (0.05 + 0.01)); System.out.println("1.0 - 0.42 = " + (1.0 - 0.42)); System.out.println("4.015 * 100 = " + (4.015 * 100)); System.out.println("123.3 / 100 = " + (123.3 / 100)); } } 0.05 + 0.01 = 0.060000000000000005 1.0 - 0.42 = 0.5800000000000001 4.015 * 100 = 401.49999999999994 123.3 / 100 = 1.2329999999999999 public class BigDecimalTest { public static void main(String[] args) { BigDecimal f1 = new BigDecimal("0.05"); BigDecimal f2 = BigDecimal.valueOf(0.01); BigDecimal f3 = new BigDecimal(0.05); System.out.println("使用String作为BigDecimal构造器参数:"); System.out.println("0.05 + 0.01 = " + f1.add(f2)); System.out.println("0.05 - 0.01 = " + f1.subtract(f2)); System.out.println("0.05 * 0.01 = " + f1.multiply(f2)); System.out.println("0.05 / 0.01 = " + f1.divide(f2)); System.out.println("使用double作为BigDecimal构造器参数:"); System.out.println("0.05 + 0.01 = " + f3.add(f2)); System.out.println("0.05 - 0.01 = " + f3.subtract(f2)); System.out.println("0.05 * 0.01 = " + f3.multiply(f2)); System.out.println("0.05 / 0.01 = " + f3.divide(f2)); System.out.println("使用double作为BigDecimal构造器参数2:"); System.out.println("0.05 + 0.01 = " + f3.add(f1)); System.out.println("0.05 - 0.01 = " + f3.subtract(f1)); System.out.println("0.05 * 0.01 = " + f3.multiply(f1)); System.out.println("0.05 / 0.01 = " + f3.divide(f1)); } } 使用String作为BigDecimal构造器参数: 0.05 + 0.01 = 0.06 0.05 - 0.01 = 0.04 0.05 * 0.01 = 0.0005 0.05 / 0.01 = 5 使用double作为BigDecimal构造器参数: 0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125 0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125 0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125 0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125 使用double作为BigDecimal构造器参数2: 0.05 + 0.01 = 0.10000000000000000277555756156289135105907917022705078125 0.05 - 0.01 = 2.77555756156289135105907917022705078125E-18 0.05 * 0.01 = 0.0025000000000000001387778780781445675529539585113525390625 0.05 / 0.01 = 1.000000000000000055511151231257827021181583404541015625
包装后的BigDecimal进行四则运算:
public class Arith { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 构造器私有,让这个类不能实例化 private Arith() {} // 提供精确的加法运算。 public static double add(double v1,double v2) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.add(b2).doubleValue(); } // 提供精确的减法运算。 public static double sub(double v1,double v2) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.subtract(b2).doubleValue(); } // 提供精确的乘法运算。 public static double mul(double v1,double v2) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.multiply(b2).doubleValue(); } // 提供(相对)精确的除法运算,当发生除不尽的情况时. // 精确到小数点以后10位的数字四舍五入。 public static double div(double v1,double v2) { BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.divide(b2 , DEF_DIV_SCALE , BigDecimal.ROUND_HALF_UP).doubleValue(); } public static void main(String[] args) { System.out.println("0.05 + 0.01 = " + Arith.add(0.05 , 0.01)); System.out.println("1.0 - 0.42 = " + Arith.sub(1.0 , 0.42)); System.out.println("4.015 * 100 = " + Arith.mul(4.015 , 100)); System.out.println("123.3 / 100 = " + Arith.div(123.3 , 100)); } }