终于明白了浮点数为什么没法精确的表示

130 阅读1分钟

我们都知道计算机中保存数据的格式是二进制,因此我们存储浮点数时也需要转换为二进制。浮点数转换为二进制时怎么转换的呢?我们来看看。
浮点数分为整数部分跟小数部分,整数部分按照 除2取余法,我们就不多赘述了,因为影响计算机存储精度的是小数部分,小数部分如何转换呢?与整数部分可不同,采用的是乘2取整法, 我们来看下:

  1. 把小数乘以2,假设结果是s,如果s大于1,该位二进制值为1,如果小于1,该位二进制值为0;
  2. 把上一步的结果s去掉整数位,只保留小数位,假设得到结果xs,如果xs等于0,转换结束,如果xs大于0,重复第1步。

我们拿1.2举例子:

s计算xs进制
0.20.2*2=0.40.40
0.40.4*2=0.80.80
0.80.8*2=1.60.60
............

可以知道,小数s*0.2 = 0转换才能结束,即s=0才能结束,但是小数存在的话不可能结果为0,因此这是无限循环不可能结束的。又因为计算机存储浮点数肯定是有限的位数,那么肯定会截断小数部分,所以精度会丢失。