float和double存储类型为什么是非精确存储?

float和double存储类型为什么是非精确存储?

计算机并不能直接地精确存储十进制小数

  1. 计算机使用二进制数来存储我们的数据,而二进制数并不能直接的精确存储十进制小数
  2. 我们人类常常使用十进制进行运算,所以可能没有注意到进制与进制之间并一定能精确转换,比如三进制的 0.1 ,在十进制中是0.33的无限循环,二进制和十进制也类似。
  3. 举个粒子,十进制的 0.6 相当于二进制的 11/101 ,我们来算一下看看是多少
  4. 可见,在十进制中的 0.6 在二进制中是 0.10011001 的无限循环, float 和 double 使用的浮点数存储结构虽并不是直接的二进制数,但终归还是二进制数,也就无可避免地不能很好地兼容十进制小数。

拓展:探索时发现的特异点

  1. float 分成三个部分:1.符号位:1位; 2.指数位:8位; 3.尾数位:23位
  2. float 默认有个1不会写出来,转换时需要在尾数位前面加上
  3. float 的指数位为需要 -127 才能得到 float 真正的指数
  4. float 的指数位底数为 2
  5. float 存储负数时用的也是原码而非补码
  6. 丢给你个神秘链接:IEEE-754浮点转换器

  目录