为什么浮点数不精确?
- float占用32位(1位符号,8位指数,23位尾数)
- double占用32位(1位符号,11位指数,52位尾数)
- 基于上面的理论,可知存储的数字是有限的,那么对于一些无限不循环(这里的无限不循环和十进制的无限循环有点不一样)的就必定会存在精度损失
为什么 0.1 的 float 近似值是 0.10000000149011612?(为什么一定是这个数字?)
0.375 表示如下
1/(2^2) + 1/(2^3) == 1/4 + 1/8 == 0.375
二进制则表示为 0.011
0.1 表示如下
1/8=0.125、1/16=0.625- 因此
0.1=0.625+0.03125+...(2的指数永远加不到1) =1/(2^4)+1/(2^5)+... - 二进制即是
0.0001100110011001100110011001100.....无限不循环 - float和double都是有限位存储,必须舍入(舍入规则不展开了),因此用float举例则被截断为0.00011001100110011001101(最后的1本来是0,但是由于舍入规则变成1),最后十进制表示的值就变成了0.10000000149011612,后面的这串数字就是因为舍入得到的,因此浮点数并不是精确值而是近似值