Java中的简单浮点数类型float和double不能够进行精确运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的简单浮点数类型float和double不能够进行精确运算相关的知识,希望对你有一定的参考价值。

在java中,简单的浮点类型float和double是不能够进行运算。我们先看下面的两个程序代码:

代码一:

import java.util.Scanner;

class Circle {
double radius;
static final double PI=3.14;
public Circle(){this.radius=0;}
public Circle(double r){this.radius=r;}
public double getArea(){return PI*this.radius*this.radius;}
public double getPerimeter(){return 2*PI*this.radius;}
}

public class Cylinder extends Circle {
private double height;
public Cylinder(double r,double h){
this.height=h;
this.radius=r;
}
public double getHeight(){return this.height;}
public double getVol(){return this.height*PI*this.radius*this.radius;}
public void dispVol(){System.out.println("圆柱体的体积:"+this.getVol());}
}

public class Test {

public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入圆的半径以及圆柱体的高:");
double r=input.nextDouble();
double h=input.nextDouble();
Cylinder A =new Cylinder(r,h);
A.dispVol();
}

}

     代码二:我们不修改Circle父类和主函数,我们就改一下子类Cylinder中的getVol()方法的方法体  public double getVol(){return this.height*this.getArea();},从上面的程序我们可以看一下,其实可以理解为达到的程序效果是一样的。

但是我们输入7和6,或是6,5,这两组数据时,我们会发现结果有一定的出入了。

结果如下:

代码一:                                                                      代码二:

请输入圆的半径以及圆柱体的高:                                                 请输入圆的半径以及圆柱体的高:
7                                                                                               7
6                                                                                               6
圆柱体的体积:923.16                                                                 圆柱体的体积:923.1600000000001

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

代码一:                                                                       代码二:

请输入圆的半径以及圆柱体的高:                                                 请输入圆的半径以及圆柱体的高:
6                                                                                              6
5                                                                                              5
圆柱体的体积:565.2                                                                圆柱体的体积:565.1999999999999

 

 为什么会出现以上的结果呢?

             我们可以这么说,浮点数是不适合精确计算的,而适合于科学计算

            举个小例子:1.double a=(1.2-0.4)/0.1;System.out.println(a);2.double a=0.8/0.1;System.out.println(a);这两段代码结果是不同的,第一个结果是7.9999999999999999,第二个结果是8.0。我们都知道,计算机里面数的计算都是二进制计算的,我们其实输入的十进制数,有些十进制数转换成二进制是可以精确转换,而有些转换则不是精确转换,得到的是一个最靠近它的数,所以这里面就存在一个误差。另外,如果浮点数不进行计算时,在十进制里面浮点数能正确显示,如果浮点数参与了计算,那么浮点数二进制与十进制间的转换过程就会变得不可而知,变得不可逆。那么,我们怎样用浮点数来进行精确计算呢?

方法一:Math.round(value*100)/100.0; 如果value为4.015,那么结果保留两位小数为4.01,但是我们心里想的是4.02,因为四舍五入嘛。

方法二:DecimalFormat("0.00").format(4.015);这条代码的结果也是同样的保留两位小数为4.01,并非4.02

方法三:new java.math.BigDecimal(Double.toString(4.015)).setScale(2,java.math.BigDecimal.ROUND_HALF_UP).doubleValue();这条代码的结果同样的是保留两位小数,但是却为4.02,真正的是四舍五入

    关于以上的三个方法的代码,可以参考java API 文档。以上的就是一个JAVA初学者的一点小小的总结,希望大家多点评价和讨论!感谢!

以上是关于Java中的简单浮点数类型float和double不能够进行精确运算的主要内容,如果未能解决你的问题,请参考以下文章

Java中浮点类型的精度问题 double float

浮点数在金额计算中的使用总结

JAVA中的小数

第04部分:浮点数类型

float和double的区别 float和double5点区别

基本数据类型float和double的区别