上篇中提到了ieee编码并留了一个浮点型数据存储与精度丢失的问题。本以为这是一个特别高深的底层问题,但经过查阅资料后发现,这个问题其实很简单,了解两个知识点就能清楚到底是怎么回事了。
- 知识点1:
首先让我们来复习一下整数转为二进制的过程
例子:十进制数9转为二进制
商 余数
9/2 4 ... 1
4/2 2 ... 0
2/2 1 ... 0
1/2 0 ... 1
所以9的二进制码:1001
所有的整数按照这种方式转换,都能用一个准确的二进制表示,所以所有整数都能用二进制精确表示
然后我们再来看看浮点数转化为二进制的过程
例子:3.2转为二进制
整数部分同上3-->0011
小数部分0.2
0.2 * 2 = 0.4 取整数部分 0
0.4 * 2 = 0.8 取整数部分 0
0.8 * 2 = 1.6 取整数部分 1
0.6 * 2 = 1.2 取整数部分 1
0.2 * 2 = 0.4 取整数部分 0
.
.
.
所以3.2的二进制码:11.00110011...(这不是最后的二进制码,这是为了方便理解进行整数与小数换算后的凑合)
可以看出,小数部分是不能用二进制准确表述出来的。这就像我们常用的十进制不能准确表示1/3 — 0.333333…
二进制也不能准确表示1/10 (0.1–>0.2–>0.4–>0.8–>(1.6取小数)0.6–>(1.2取小数)0.2…)