引用參考html
https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528java
https://blog.csdn.net/yansmile1/article/details/70145416算法
java語言中,float類型數字在計算機中用4個字節(32位)來存儲。double類型佔用8個字節(64位)。 從存儲結構和算法上來說,double和float是同樣的,不同的地方僅僅是float是32位的,double是64位的,因此double能存儲更高的精度。spa
按照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法:用符號、指數和尾數來表示。指數可正可負,因此,IEEE規定,此處算出的次方必須減去127纔是真正的指數。底數定爲2,即把一個浮點數表示爲尾數乘以2的指數次方再添上符號。.net
下面是具體的規格: htm
類型 | 符號位 | 指數 | 尾數 | 長度 |
float | 1 | 8 | 23 | 32 |
double | 1 | 11 | 52 | 64 |
以float爲例:blog
由於指數須要減去127,因此float類型的指數可從-126到128。內存
科學計數法:table
格式:
SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM引用
S表示浮點數正負
E表示指數加上127的值後獲得的二進制數據
M表示尾數,最高位固定爲1
舉例:
17.625在內存中的存儲爲:
首先要把17.625換算成二進制:10001.101。
整數部分:除以2,直到商爲0,餘數反轉。(即:模2取餘法)
17 % 2 = 8 ---> 1 低位
8 % 2 = 4 ---> 0
4 % 2 = 2 ---> 0
2 % 2 = 1 ---> 0
1 % 2 = 0 ---> 1 高位
小數部分:乘以2,直到乘位爲0,進位順序取。(即:乘2取整法)
按以下算法進行:
1)首先給小數部分乘2,獲得的數,若是小數點前爲1;則計1,爲0,則計0。
2)再對剩下的小數部分乘2,再計出1或0。
3)重複以上步驟,直至達到須要的精度。
0.625 x 2 = 1.25 ---> 1 -1位
0.25 x 2 = 0.5 ---> 0 -2位
0.5 x 2 = 1.0 ---> 1 -3位
0.0 x 2 = 0.0 ---> 0 -4位
........
以上獲得17.625換算成二進制爲10001.101。
再將10001.101右移,直到小數點前只剩1位,1.0001101 * 24 ,右移動了四位。
此時,底數和指數就出來了。
底數:由於小數點前必爲1,因此IEEE規定只記錄小數點後的就好。因此,此處的底數爲:0001101
指數:實際爲4,必須加上127(轉出的時候,減去127),因此爲131。也就是10000011
符號:由於是正數,因此是0
綜上所述,17.625在內存中的存儲格式是:01000001 10001101 00000000 00000000