浮點數的數據結構

週末在家,從新學習了一下之前不太懂的知識點。浮點數和數據結構。數據結構

 

1 什麼是浮點數?學習

通俗來講帶有小數點的數都是浮點數。好比1.1,121.212,-1.11,-222.111spa

 

2 在JAVA中經常使用表示浮點數的類型是什麼?區別是什麼?3d

在JAVA中,一般使用的浮點數的類型爲 FLoat和Double,他們的區別在於大小與儲存方式不一樣code

public class App {
    public static void main(String[] args) {
        System.out.println("Float:"+Float.SIZE);
        System.out.println("Double:"+Double.SIZE);
    }
}
Float:32
Double:64

從這裏能夠看出FLoat是32位的,Double是64位blog

Float的儲存結構          0        00000000 00000000000000000000000源碼

                            符號位1     階數位8      小數位23(8388607(7位十進制)<9999999(7位十進制))因此他的精度是保證6但不到7class

Double的儲存結構      0        00000000000    0000000000000.。。。。。。。。。。。。。。。。原理

                            符號位1     階數位11     小數位52---------這個就不少了循環

3 浮點數二進制源碼如何轉換成對應的FLOAT和DOUBLE的數據結構呢?

這裏有幾個步驟 

step1 獲得 二進制浮點數源碼 好比1010101.101011011

step2 二進制源碼轉換爲二進制科學計數法1.010101101011011E0110(0110表示<<6)

step3 E0110轉換成階碼,若是是FLOAT的階位轉換是0110+1111111(7位)Double的階位轉換是0110+1111111111(10位) 

step4 按照浮點數的儲存結構來存放咯。

 

4 作一道例題(摘自網上)

    public static void main(String[] args) {
        float f_v1 = 20;
        float f_v2 = 20.3f;
        float f_v3 = 20.5f;
        double d_v1 = 20d;    
        double d_v2 = 20.3d;
        double d_v3 = 20.5d;
        System.out.println(f_v1==d_v1);
        System.out.println(f_v2==d_v2);
        System.out.println(f_v3==d_v3);
    }
true
false
true

第一題和第三題的TRUE的緣由是,二進制浮點數的位數比較少,小於Float的23位,因此Float徹底能精確到

第二題中的FLASE的緣由是,0.3的二進制浮點數是一個無線循環小數,超過了Float的23位,Float進行了截短到23位,而Double有52位,因此2者不相同。

知道了原理後,咱們怎麼讓他變成TRUE呢?

    public static void main(String[] args) {
        float f_v2 = 20.3f;
        double d_v2 = (float)20.3d;
        System.out.println(f_v2==d_v2);
    }
true

很簡單,咱們去按照Float類型截短一下就OK了。

 

5 幫助小貼士-如何轉換10進制浮點數-->2進制源碼

10進制20.3

step1 整數部分 20-->10100

計算過程:

除法    是否有餘數 

20/2    0

10/2    0

5/2      1

2/2      0

1/2      1

step2 小數部分 0.3-->010011001100。。。

計算過程

0.3*2 = 0.6     0

0.6*2 =  1.2    1

0.2*2 = 0.4     0

0.4*2 = 0.8     0

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

0.8*2 = 1.6     1

0.6*2 = 1.2     1

0.2 *2 = 0.4    0

0.4*2 = 0.8     0

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

...                  1

...                  1

...                  0

...                  0

step3 整合整數和小數部分 10100.010011001100

若是須要轉換成Float或者Double的話,參照上面文中的流程

1 轉科學計數法

2 指數部分轉換爲階數位(Float是127,Double是1023)

3 按值填入數據結構中

相關文章
相關標籤/搜索