float類型的范圍:
-
負數:-3.402823E38~-1.401298E-45
-
整數:0
-
正數:1.401298E-45~3.402823E38
long類型的范圍:
-
-2的63次方到2的63次方-1(-9223372036854775808~9223372036854775807)
float在內存中占4個字節,共32位,但是浮點數在內存中時這樣的:
IEEE浮點標准:V = (-1) ^ S * M * 2 ^ E
浮點型數值內存分配示意圖 | ||
---|---|---|
第一位 | 第二位到第九位 | 第十位到第三十二位 |
S | E | M |
其中第1位,符號位,即S。
接下來的8位,指數域,即E。
剩下的23位,小數域,即M,M的取值范圍為[1,2)或[0,1)。
也就是說,浮點數在內存中的二進制值不是直接轉換為十進制數值,而是按照公式計算得出,通過公式,雖然只用到了4個字節,但是浮點數卻比長整型的最大值要大。
示例如下:
int n = 123456789; float f = n; // f is 1.23456792E8
從n到f轉換時,雖然得到了同樣大小的結果,但卻失去了一定的精度。
說白了就是long類型占用8個字節,是為了嚴密精確的表達每一位數值。float類型占用了4個字節,雖然表示數據范圍更大,但是存在精度損失。
那么為什么不把float占用的字節數也擴大,達到嚴密精確呢?
這是因為使用了IEEE浮點標准!