Java-关于基本数据类型中浮点数计算产生的精度问题

简单关于BigDecimal类

  • 在基本数据类型中,float和double都表示浮点型数据,而计算机计算采取的是对二进制的计算,所以会存在一定程度上的精度丢失问题。
  • BigDecimal类是一个大小数操作类,可以用来对超过16位有效位的数据进行精确的运算,在这里我们使用BigDecimal类来解决浮点数计算产生的精度丢失问题。

精度问题

  1. 在这里我们讨论一个问题:3 - 2.7 == 0.3 的值是什么?
  2. 首先对表达式进行分析,该表达式有两个运算符,分别为减运算符 -和关系运算符 = = ,由于减运算符 - 的优先级高于关系运算符,所以该表达式将输出一个布尔值,即输出一个true或者false,具体输出什么取决于3 - 2.7 的值。
  3. 在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 类对象,例如第二个例子

发布了5 篇原创文章 · 获赞 5 · 访问量 203

猜你喜欢

转载自blog.csdn.net/cccccv_/article/details/104495278