今天在学习Python核心编程的时候,十进制浮点数那段看到一个有趣的事情。
>>>0.1
0.1000000000000001
为什么会这样?
这是因为Python语言的浮点型实现遵守IEEE754规范。Python是使用其中53位用做指数偏移值,因此浮点值只能有53位精度,类似这样的值用二进制表示只能像上面那样被截断。根据IEEE754规范,0.1的二进制表示是1.100110011001100110011001…*2-4 ,因为它最接近的二进制近似值是0.0001100110011…,或1/16+1/32+1/256+…
意思就是四舍五入之后就变成0.1000000000000001了,上面这段话你很可能看得似懂非懂。
后来Python的更新解决了上述情况,将代码截断输出,我在Python 3跟Python2.7中都试过,并没有上述所说的这种问题。
但你可以试下
3 * 0.1 == 0.3
这段代码输出为False
要解答上面这个0.1的输出,咱们就需要一步步来了。
第一步,先把 0.1 转成二进制
整数转二进制大家肯定都知道的,这个就不说了,但是小数部分怎么转可能还是有些同学不知道。没关系,附上链接:二进制十进制间小数怎么转换
0.1 = 1/16 + 1/32 + …
我简单画个图,后面的位自己补上。
二进制 | 1/2 | 1/4 | 1/8 | 1/16 | 1/32 | 1/64 | 1/128 | 1/256 | 1/512 | 1/1024 | 1/2048 | … |
---|---|---|---|---|---|---|---|---|---|---|---|---|
值 | 0 | 0 | 0 | 1< |