浮点数在计算机中存储也是以二进制的形式,遵循IEEE二进制算数标准;格式为:
float : 符号位(首位)、指数位(8位)、尾数(23位)
double:符号位(首位)、指数位(11位)、尾数(52位)
一 格式
符号位:0 正数 1 负数
指数位:二进制转换为十进制的偏差为 2^(位数-1)-1
尾数:小数部分,由于尾数规格化,所以最高位总是1,所以直接就隐藏掉。。。
二 转为示例
1、0.5转为二进制
首先正数,首位 0
其次整数部分为0,小数0.5,(取整数部分)
0.5*2 = 1.0 (取1)
所以为 0 . 100 0000 0000 0000 0000 0000, 右移 1位为 1 . 000 0000 0000 0000 0000 正好符合规则,
所以最终尾数为000 0000 0000 0000 0000
最后指数位:2^(8-1) -1 + (-1) = 126 => 0111 1110
最终转为二进制为: 0 0111 1110 000 0000 0000 0000 0000
2、-20.3 转为二进制
首先负数,首位 1
其次整数部分为20 => 10100,小数0.3,
0.3*2 = 0.6 (0)
0.6*2 = 1.2 (1)
0.2*2 = 0.4 (0)
0.4*2 = 0.8 (0)
0.8*2 = 1.6 (1)
0.6*2 = 1.2 (1)
。。。。
所以为 10100 . 010011001 ... 1001循环,左移4位为1 . 01000100110011001100110 正好符合规则,
所以最终尾数为 010 0010 0110 0110 0110 0110
最后指数位:2^(8-1)-1+4 = 131 => 1000 0011
最终二进制为 1 1000 0011 010 0010 0110 0110 0110 0110
三 转为浮点数示例
1、 1 1000 0011 010 0001 0000 0000 0000 0000
首先首位1,负数
其次指数位 1000 0011 为131,131-127=4,左移了4位
最后尾数位 010 0001 0000 0000 0000 0000,则 1. 010 0001 0000 0000 0000 0000,右移四位,10100 . 001 0000 0000 0000 0000,
则 10100 为 20,001 0000000000... :
0*2^(-1)+0*2^(-2)+1*2^(-3) = 0.125,
所以最终为20.125
四 java处理
//浮点数转为二进制
float f = 20.3f;
int i = Float.floatToIntBits(f);
System.out.println(Integer.toBinaryString(i));