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浮点标准!