Java 浮点数存储方式

Java浮点数使用的是IEEE二进制浮点数算术标准。

浮点数分为符号,指数,分数三部分。以32位浮点数为例,分为1符号位+8指数位+23分数位。

1(bit) 8(bit) 23(bit)
符号 指数 分数

以173.7为例:

173.7为正数,故符号位为0

0 00000000 00000000000000000000000

将其转换成1.??? * 2^?形式

1
2
3
4
5
6
7
173.7/2=86.85            2^1
86.85/2=43.425 2^2
43.425/2=21.7125 2^3
21.7125/2=10.85625 2^4
10.85625/2=5.428125 2^5
5.428125/2=2.7140625 2^6
2.7140625/2=1.35703125 2^7

最终格式为1.35703125*2^7 ,指数位的值为7,由于指数部分是由Bias偏移量来表示的,float的偏移量为Bias=2^k-1 -1=2^8-1 -1=127,做指数部分的值为127+7=134,134的二进制值为 1000 0110,则符号位+指数为存储格式如下:

0 1000 0110 00000000000000000000000

计算尾数部分,由于浮点数最终都是以1.??? * 2^?的形式保存的,小数点左边永远是1,所以我们只需关心小数点后面部分

Number X2 1/0
0.35703125 0.7140625 0
0.7140625 1.428125 1
0.428125 0.85625 0
0.85625 1.7125 1
0.7125 1.425 1
0.425 0.85 0
0.85 1.7 1
0.7 1.4 1
0.4 0.8 0
0.8 1.6 1
0.6 1.2 1
0.2 0.4 0
0.4 0.8 0

由于到了0.4这一步这边是会个循环,0110 0110 …
加上尾数部分,最终存储格式如下:
0 1000 0110 01011011011001100110011

我们可以通过Float.floatToIntBits(173.7)来验证结果:

1
2
3
Float.floatToIntBits(173.7) = 1127068467
1127068467用二进制表示,就是
0 10000110 01011011011001100110011