周末在家,重新學習了一下以前不太懂的知識點。浮點數和數據結構。
1 什么是浮點數?
通俗來說帶有小數點的數都是浮點數。比如1.1,121.212,-1.11,-222.111
2 在JAVA中常用表示浮點數的類型是什么?區別是什么?
在JAVA中,通常使用的浮點數的類型為 FLoat和Double,他們的區別在於大小與儲存方式不同
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位
Float的儲存結構 0 00000000 00000000000000000000000
符號位1 階數位8 小數位23(8388607(7位十進制)<9999999(7位十進制))所以他的精度是保證6但不到7
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 按值填入數據結構中