在《计算机组成原理》中学过浮点数在计算机中的存储方式遵循IEEE 754浮点数计数标准,可以表示为:
采用 尾数+阶码 的编码方式,或者说:有效数字 + 指数位数
因此,只要给出符号位(S)、阶码部分E、位数部分M这三个维度信息,一个浮点数就完全表示出来了,所以float和double这两种类型的浮点数在计算机中的存储结构如下:
-
符号部分:S
0-正 1-负 -
阶码部分E
对于float类型,指数部分是8位,考虑正负,因此表示指数范围是-127-128
对于double类型,指数部分11位,指数范围是-1023-1024 -
尾数部分M
浮点数的精度是由尾数来决定的:
float类型,尾数部分23位,换成十进制就是2^23=8388608,因此十进制精度只有6-7位
对于double类型,尾数部分52位,换成十进制就是2^52 = 4503599627370496,所以十进制精度只有15 ~ 16位
因此,浮点数交给计算机存储时会出现精度丢失的问题。
进制转换问题
例如6.36转为二进制
整数和小数部分得到的二进制结果是:110.01011100…
按照尾数+阶码的方式
符号位:0
阶码E:127 + 2 = 129 二进制为:10000001
尾数部分M:1001011100…,其实它本身无限不循环,但若以float型精度来截取23位,则可以表示为10010111000010100011111
最终结果:0 10000001 10010111000010100011111
因此对于这种无限位数的尾数情况,计算机产生截取是必然的,必定会产生精度的损失,因此,在使用float和double时要结合业务考虑。