首先明确,7位有效位是整数部分和小数部分位数的和。例如:
float a=61.420001f。打印输出a=61.420002(62.420001机器无法表示,会自动向最近的能表示的数舍入成61.420001)
(整数部分2位+小数部分6位=8位>7位,所以不能精确表示)
为了深入理解原理,我们首先要了解浮点数在计算机内的表示。在计算机内,浮点数是以32位二进制数来存储表示的,其中32位分为符号位(1位)、阶码(8位)和尾数(23位)三个部分组成,参考计算机组成原理教材,格式如下,:
符号位 阶码 尾数
1位 8位 23位
比如130.0可表示为:130.0=1000 0010B=1.000 0010*(2^7) //都要转化为1.xxx*(2^yy)这种形式
符号位(正负号) 阶码(指数7+127) 尾数(小数部分)
0 1000 0110 0000 0100 0000 0000 0000 000
从浮点数二进制表示格式可以知道,尾数部分表示的是23位效位数,因为23位尾数表示的是小数点右边的数,小数点左边是默认是1,所以一共能表示24位有效数,
而 2^(24) = 16777216,转化为十进制10^7 < 16777216 < 10^8,所以只能精确表示7位。
注意事项:以上只能说明超过7位一定不能精确表示,而小于7位时有可能被精确表示,为什么这么说,比如0.1就不能被精确表示,这是因为浮点数表示的并不是连续的数,而是离散的数。
以上纯属个人见解,还有些东西因为解释起来太复杂就所以就没说。