float类型

        float类型遵循IEEE754标准,该标准为32位浮点数规定了二进制表示形式。IEEE754采用二进制的科学计数法来表示浮点数。对于float浮点数,用1位表示数字的符号(浮点数正负性,0正1负),8位来表示指数(底数为2),23位表示尾数,如图1-1所示。float类型_第1张图片
float类型_第2张图片

1.指数E在1 ~ 254

        在IEEE754中,约定小数点左边有一位隐含位。在表1-2中,“0.M”和“1.M”中的0和1就是隐含位。当指数取值在1 ~ 254时,这个隐含位为1,所以实际上尾数的有效位数是24位,即:1.MMMMMMMMMMMMMMMMMMMMMMM
        指数也叫阶码,为了表示指数的正负,阶码采用移码表示,移码值位127。所以float类型的实际取值可以用以下二进制表达式表示:
(-1)s *2E-127 *(1.M)。

float数字0.1

        计算出0.1的二进制形式

float f = 0.1f;
System.out.println(Float.floatToIntBits(f)); 

结果为1036831949,对应的32位二进制形式为;
0 01111011 10011001100110011001101
S = 0,E = 01111011 M = 1.10011001100110011001101 所以根据公式可得
(-1)0 * 2123-127 * 1.10011001100110011001101
最后计算可得110011001100110011001101 * 2-27 = 13421773 * 2-27
值为0.100000001490116119384765625
由此可得,在内存中,32位的二进制科学记数法不能精确的表示0.1,它与实际的0.1的误差为0.000000001490116119384765625。所以用浮点数进行数学计算时,会导致一些误差。

2.指数E为0

        当S,E,M部分都是0时,就表示数字0.0。如果指数位是0,尾数不为0,那么float的取值为:(-1)s *2-126 *(0.M)。这个范围内的浮点数绝对值都很小,可以表示接近于 0 的小数。

3.指数E为255

         这个用来表示一些特殊的数字,如表 1-2 所示:float类型_第3张图片
用Float的静态常量来表示这些特殊数字。

你可能感兴趣的:(Java)