008_浮點數誤差問題


一、浮點數

  a):float類型又被稱作單精度類型,尾數可以精確到7位有效數字,在很多情況下,float類型的精度很難滿足需求。

  b):double表示這種類型的數值精度是float類型的兩倍,又被稱作雙精度,絕大部分應用程序都采用double類型。

二、浮點數的表述范圍

  

類型

占用存儲空間

表數范圍

float

4字節

-3.403E38~3.403E38

double

8字節

-1.798E308~1.798E308

三、在java中表示浮點數的兩種表示形式

  a):十進制形式         如:3.14       314.0      0.314

  b):科學記數法形式  如: 314e-2      3.14e2      314E-3

四、測試浮點數代碼:  

 
         
public class TestFloadAndDoubleType {

    public static void main(String[] args) {
        /*
        [X]因為浮點數默認是double類型、而float f=0.1中0.1默認是double類型的、
        這樣的話將一個8個字節的double類型轉換為4個字節的float類型會出現編譯錯誤
        為了明確其類型我們在后面加f
        */
        //float a=0.1;//[X]錯誤的
        float b=0.1f;//[√]加f來明確其類型、正確的
        //浮點數可以用科學計數法來表示
        double c=314e-2;//3.14
        double d=314e-3;//0.314
        System.out.println("double c=314e-2中c的執行結果為: c="+c);
        System.out.println("double d=314e-3中d的執行結果為: d="+d);
        //浮點數的比較(注意:浮點數運算結果比較存在誤差問題、所以不能精確比較)
        double e=1.0/10; //0.1
        System.out.println("浮點數運算結果誤差示例:0.1f==1.0/10其比較結果為:"+(b==e));
        float d1 = 423432423f;
        float d2 = d1+1;
        /**
         * 二進制表示浮點數誤差問題
         */
        System.out.println("d1="+d1);
        System.out.println("d2="+d2);
        System.out.println("423432423f==423432423f+1的比較結果為: "+(d1==d2));//天吶盡然誤差到相當?
    }
}
 
        

測試結果為:

  

 

五、總結

  a):浮點數的默認類型為double類型

  b):浮點類型float, double的數據類型不適合在不允許有舍入誤差的金融計算領域

  c):由於浮點數占用存儲空間有限,所以能夠精確表示的數是有限的,因而也是離散的。浮點數一般都存在舍入誤差,很多數字無法精確表示,其結果只能是接近,但不等於。

  d):二進制浮點數不能精確的表示0.1,0.01,0.001這樣10的負次冪。並不是所有的小數都能可以精確的用二進制浮點數表示。

  e):如果需要進行不產生舍入誤差的精確數字計算大小數使用BigDecimal類、大整數BigInteger

  注意:通過以上我們對浮點類型的了解、我們應該避免編程中使用浮點類型進行的運算結果的比較


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM