float浮点数

float是计算机编程语言中常用的变量类型,称为单精度浮点数。浮点数不像整数变量只用符号位和数值位就能表示,float单精度浮点数在计算机占32位(四个字节),它储存在计算机时讲32位划分为三个部分,符号位,指数和尾数。下面将从这三个部分理解浮点数的表示范围

符号位

符号位最为简单,只占用1位最高位,0表示整数,1表示负数。

java float范围 java的float_java

指数

指数位负责表示浮点数中的最高位,2^4的话则4为指数部分。也称为阶码

指数部分在32bit内存中占有8位,即表示范围是0~255

由于指数部分既可以表示正数,也可以表示负数,所以它实际并不能表示到255左右,将255分为正负两个部分,范围就变成了-127~128。负数是-127的原因是0这个数有特殊意义,所以不用于表示范围。**指数部分在运用时,会加上偏移量127,**这样包含正数负数,范围就又是0 ~ 255了。

java float范围 java的float_有效数字_02

尾数

小数部分将十进制小数转换为二进制所得。

java float范围 java的float_浮点数_03

浮点数转换

以5.8为例,
整数部分5,转化内二进制是101,
0.8转化为二进制,
0.82=1.6,取1余0.6
0.6
2=1.2,取1余0.2
0.22=0.4,取0余0.4
0.4
2=0.8,取0余0.8
0.82=1.6,取1余0.6
0.6
2=1.2,取1余0.2
0.2*2=0.4,取0余0.4

无限循环,所以5.8转换为二进制之后是
101.110011001100110011001100…
将小数点移动到第一个有效数字1后,即为1.0111001100110011001100…
向左偏移了2位,则指数部分为+2,(向右偏移的时候为负)
运用指数部分定义规则,5.8的指数部分2加上指数部分偏移量,2+127=129,在八位指数位表示为10000001。
这样就可以将5.8转换为float类型表示了,
符号位0,指数部分10000001,尾数部分截取小数后23位,
即01110011001100110011001,
#为什么不取整数部分1? 因为偏移时将小数点部分移到了第一个有效数字后,所以小数点左边必为1,所以可不必花费内存表示。
这样5.8存在float类型后的值为
0_1000001_01110011001100110011001。

float的取值范围

经过上面的解释,我们便可以知道float的取值范围与精度,

32位float类型,最高位符号位不表示数值,
之后8位表示指数,指数决定了该浮点数的取值范围是2^ -127 ~ 2^ 128
最后尾数部分23位(小数点前必是一个1,所以虽然表示了24位,但是仅有23位影响精度)即2^23=8388608,正数可表示8388608,负数也一样,所以float的精度为1677216(8位有效数字)