在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初学者的一点小小的总结,希望大家多点评价和讨论!感谢!