这不是Python的bug,而是几乎所有编程语言都会遇到的情况。
究其原因,是因为计算机是用二进制来表示数据的。
我们可以这样来理解:
在十进制数里,有些小数可以精确地表示,比如0.5,就是1/2
但有些小数却无法精确地表示,比如1/3 就是0.333……,无限循环,永远写不完,后面无论取多少位,一定是有误差的。
同样的道理,在二进制里:
0.1 在二进制里就是无限循环小数,就像十进制里的 1/3 一样
计算机的存储空间是有限的,只能“截断”到某一位,存一个近似值。所以就有了误差。
数字是如何用二进制转换,以后在讲信息编码时会详细说到,不过重点是讲整数如何转换成二进制,浮点数转换成二进制会略讲。
既然浮点数有误差,在计算或比较时,该如何处理呢?
1、判断两个浮点数是否相等
比如,0.1+ 0.2 是否等于 0.3
因为 0.1 + 0.2 的结果是 0.30000000000000004,不等于 0.3,这是悖论
处理方法:判断它们的差值是否足够小,比如0.1+0.2 - 0.3的差值小于0.0000000001,我们就认为0.1+ 0.2 等于 0.3
先了解思路即可,具体语句会在选择结构中讲解。
2、让结果看起来正常
如果你只是想让输出结果好看,可以用round()四舍五入
round(x, n) 表示把 x 保留 n 位小数。
事实上,在计算并输出的时候,round()的使用频率还是很高的。
比如计算圆的周长时:
如果你不用round(),可能输出一长串数字,看起来不够整洁,round(c,2)可以让结果保留2位小数。