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父類和主函數(shù),我們就改一下子類Cylinder中的getVol()方法的方法體? public double getVol(){return this.height*this.getArea();},從上面的程序我們可以看一下,其實可以理解為達到的程序效果是一樣的。
但是我們輸入7和6,或是6,5,這兩組數(shù)據(jù)時,我們會發(fā)現(xiàn)結(jié)果有一定的出入了。
結(jié)果如下:
代碼一: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???代碼二:
請輸入圓的半徑以及圓柱體的高: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??請輸入圓的半徑以及圓柱體的高:
7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??7
6 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??6
圓柱體的體積:923.16 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??圓柱體的體積:923.1600000000001
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
代碼一: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代碼二:
請輸入圓的半徑以及圓柱體的高: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??請輸入圓的半徑以及圓柱體的高:
6 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?6
5 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?5
圓柱體的體積:565.2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圓柱體的體積:565.1999999999999
?
?為什么會出現(xiàn)以上的結(jié)果呢?
? ? ? ? ? ? ?我們可以這么說,浮點數(shù)是不適合精確計算的,而適合于科學(xué)計算
? ? ? ? ? ? 舉個小例子:1.double a=(1.2-0.4)/0.1;System.out.println(a);2.double a=0.8/0.1;System.out.println(a);這兩段代碼結(jié)果是不同的,第一個結(jié)果是7.9999999999999999,第二個結(jié)果是8.0。我們都知道,計算機里面數(shù)的計算都是二進制計算的,我們其實輸入的十進制數(shù),有些十進制數(shù)轉(zhuǎn)換成二進制是可以精確轉(zhuǎn)換,而有些轉(zhuǎn)換則不是精確轉(zhuǎn)換,得到的是一個最靠近它的數(shù),所以這里面就存在一個誤差。另外,如果浮點數(shù)不進行計算時,在十進制里面浮點數(shù)能正確顯示,如果浮點數(shù)參與了計算,那么浮點數(shù)二進制與十進制間的轉(zhuǎn)換過程就會變得不可而知,變得不可逆。那么,我們怎樣用浮點數(shù)來進行精確計算呢?
方法一:Math.round(value*100)/100.0; 如果value為4.015,那么結(jié)果保留兩位小數(shù)為4.01,但是我們心里想的是4.02,因為四舍五入嘛。
方法二:DecimalFormat("0.00").format(4.015);這條代碼的結(jié)果也是同樣的保留兩位小數(shù)為4.01,并非4.02
方法三:new java.math.BigDecimal(Double.toString(4.015)).setScale(2,java.math.BigDecimal.ROUND_HALF_UP).doubleValue();這條代碼的結(jié)果同樣的是保留兩位小數(shù),但是卻為4.02,真正的是四舍五入
? ? 關(guān)于以上的三個方法的代碼,可以參考java API 文檔。以上的就是一個JAVA初學(xué)者的一點小小的總結(jié),希望大家多點評價和討論!感謝!
轉(zhuǎn)載于:https://www.cnblogs.com/weihao950903/p/5335279.html
總結(jié)
以上是生活随笔為你收集整理的Java中的简单浮点数类型float和double不能够进行精确运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u盘驱动一直安装失败是怎么回事 U盘驱动
- 下一篇: 解析中间人攻击(1/4)---ARP缓存