简单关于BigDecimal类
- 在基本数据类型中,float和double都表示浮点型数据,而计算机计算采取的是对二进制的计算,所以会存在一定程度上的精度丢失问题。
- BigDecimal类是一个大小数操作类,可以用来对超过16位有效位的数据进行精确的运算,在这里我们使用BigDecimal类来解决浮点数计算产生的精度丢失问题。
精度问题
- 在这里我们讨论一个问题:3 - 2.7 == 0.3 的值是什么?
- 首先对表达式进行分析,该表达式有两个运算符,分别为减运算符 -和关系运算符 = = ,由于减运算符 - 的优先级高于关系运算符,所以该表达式将输出一个布尔值,即输出一个true或者false,具体输出什么取决于3 - 2.7 的值。
- 在Java中基本类型的浮点数运算是不精确的,如果在Java程序中输出3-2.7的值,可以看到输出的结果0.299999999999999,这个值是不精确的,所以表达式3-2.7 = = 0.3的值是假,即false,来看下面两个例子:
//(1)使用基本数据类型进行浮点数计算,并输出差值和比较结果
public class Demo1 {
public static void main(String[] args) {
System.out.println(3 - 2.7);
System.out.println(3 - 2.7 == 0.3);
}
}
//(2)使用BigDecimal进行浮点数运算,并输出差值和结果。
public class Demo2 {
public static void main(String[] args) {
//创建3的BigDecimal对象
BigDecimal x = new BigDecimal("3");
//创建2.6的BigDecimal对象
BigDecimal y = new BigDecimal("2.6");
//计算3和2.6的差值
BigDecimal z = x.subtract(y);
//将计算结果转换为基本数据类型double型
double value = z.doubleValue();
System.out.println(value);
System.out.println(value == 0.4);
}
}
//从输出结果可以看到,value的值为0.3,value == 0.3结果为true
//为了得到精确的浮点数运算结果,可以使用BigDecimal类来实现
在实际应用中为了得到精确的计算结果,对于浮点数的运算一般不使用基本数据类型来实现,而是使用 BigDecimal 类来实现,但是在使用 BigDecimal 创建对象时,构造方法的参数要使用双引号括起来,而不能直接在构造方法中写浮点值创建 BigDecimal 类对象,例如第二个例子。