週末在家,從新學習了一下之前不太懂的知識點。浮點數和數據結構。數據結構
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 按值填入數據結構中