↓
00111111 10000000 00000000 00000000(二进制)
↓
0x3F800000(十六进制)
0.99999999(十进制)
↓
00111111 10000000 00000000 00000000(二进制)
↓
0x3F800000(十六进制)
这两个十进制浮点数的底层二进制表示是一样的,怪不得==的判断结果返回true!
但是1f == 0.9999999f返回的结果是符合预期的,打印false,我们也把它们转换到二进制模式下看看情况:
1.0(十进制)
↓
00111111 10000000 00000000 00000000(二进制)
↓
0x3F800000(十六进制)
0.9999999(十进制)
↓
00111111 01111111 11111111 11111110(二进制)
↓
0x3F7FFFFE(十六进制)
它俩的二进制数字表示确实不一样,这是理所应当的结果。
那么为什么0.99999999的底层二进制表示竟然是:00111111 10000000 00000000 00000000呢?
这不明明是浮点数1.0的二进制表示吗?主要要分一下浮点数的精度问题了。
浮点数的精度问题!
学过 《计算机组成原理》 这门课的小伙伴应该都知道,浮点数在计算机中的存储方式遵循IEEE 754 浮点数计数标准,可以用科学计数法表示为:
只要给出:符号(S)、阶码部分(E)、尾数部分(M) 这三个维度的信息,一个浮点数的表示就完全确定下来了,所以float和double这两种浮点数在内存中的存储结构如下所示:
符号部分(S)
0-正 1-负
阶码部分(E)(指数部分):
对于float型浮点数,指数部分8位,考虑可正可负,因此可以表示的指数范围为-127 ~ 128
对于double型浮点数,指数部分11位,考虑可正可负,因此可以表示的指数范围为-1023 ~ 1024
尾数部分(M):
浮点数的精度是由尾数的位数来决定的:
-
对于float型浮点数,尾