天天看点

float和double的取值范围和精度丢失

一. float和double的范围

在此先补充一个知识点,浮点数的二进制转换。

长度 符号 指数 尾数 有效位数 指数偏移 说明
单精度 32位 1 8 23 24 127 含有一个隐含位
双精度 64位 1 11 52 53 1023 含有一个隐含位

以单精度为例:

float和double的取值范围和精度丢失

S’为符号位,0表示负数,1为正数;E’为阶码,即指数部分,八位可表示256个数值,指数偏移为127(见表格),即指数范围为-127~+128,计算时实际指数=E’-127;FR’为尾数部分,表示的是科学计数法中小数部分,整数部分默认为1,即计算时实际尾数为1.尾数,例尾数为10101010101010101010101,则计算时1.10101010101010101010101;

浮点数二进制转换为十进制为:

x = (-1)^s X(1.FR’)X 2^(E-127)

float为单精度浮点型,double为双精度浮点型,取值范围主要看指数部分,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

二 精度丢失

为什么int,float同用32位表示,但是float范围就比int大很多呢? float的精度缺失是什么原因呢?

因为int数值是连续的,而float数值是跳跃的,并且间隔不一定相等。同用32位表示意思为两个数据类型可存储数值的最大数量是相等的,为2的32次方。

举例:

float和double的取值范围和精度丢失

由图可知,两种类型表示相同数量的数时,float表示的范围大,但同时有一些数float不能表示,如上图的2或4等,所以精度缺失,建议慎用float。