为什么浮点数不精确?

  1. float占用32位(1位符号,8位指数,23位尾数)
  2. double占用32位(1位符号,11位指数,52位尾数)
  3. 基于上面的理论,可知存储的数字是有限的,那么对于一些无限不循环(这里的无限不循环和十进制的无限循环有点不一样)的就必定会存在精度损失

为什么 0.1 的 float 近似值是 0.10000000149011612?(为什么一定是这个数字?)

0.375 表示如下

1/(2^2) + 1/(2^3) == 1/4 + 1/8 == 0.375

二进制则表示为 0.011

0.1 表示如下

  1. 1/8=0.125 、1/16=0.625
  2. 因此 0.1=0.625+0.03125+... (2的指数永远加不到1) = 1/(2^4)+1/(2^5)+...
  3. 二进制即是 0.0001100110011001100110011001100..... 无限不循环
  4. float和double都是有限位存储,必须舍入(舍入规则不展开了),因此用float举例则被截断为0.00011001100110011001101(最后的1本来是0,但是由于舍入规则变成1),最后十进制表示的值就变成了0.10000000149011612,后面的这串数字就是因为舍入得到的,因此浮点数并不是精确值而是近似值