java.math包中提供了BigDecimal类,用来对超过16位有效位的数进行精确的运算。float和double只能用来做科学计算或工程计算,在商业计算中例如金额若需要精确的计算结果就要用到BigDecimal类。
一般的算术运算
System.out.println(0.06 + 0.01);
System.out.println(1.0 - 0.43);
System.out.println(4.015 * 100);
System.out.println(303.1 / 1000);
0.06999999999999999
0.5700000000000001
401.49999999999994
0.30310000000000004
出现了丢失精度的情况
BigDecimal的几种构造方法
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
BigDecimal b = new BigDecimal(1.23);
System.out.println("b:" + b);
a:1.229999999999999982236431605997495353221893310546875
参数类型为double的构造方法的结果有不确定性
BigDecimal b = new BigDecimal("1.23");
System.out.println("b:" + b);
b:1.23
String类型构造方法是确定的,建议使用
使用BigDecimal类来进行计算的时候
1、用float或者double变量先toString为字符串然后构建BigDecimal对象。
2、用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
3、把BigDecimal对象转换成float,double,int类型。
BigDecimal b1 = new BigDecimal(Double.valueOf(0.06).toString());
BigDecimal b2 = new BigDecimal(Double.valueOf(0.01).toString());
System.out.println(b1.add(b2).doubleValue());
0.07
注意
想得到理想的计算结果就使用参数类型为String的构造函数。
只在需要精确的小数计算时使用BigDecimal,在处理庞大,复杂的运算时BigDecimal的性能比double和float差。
BigDecimal都是不可变的(immutable)的, 每一次运算时都会产生一个新的对象,所以在做运算时要保存操作后的值。