很简单的一道数学题,电脑竟然不会做!
“5.4-2”与“3.4”相等吗?
电脑会很清楚、很坚定地告诉您:不相等。
您一定脸上写满了惊讶!
![c756d3e3ca0eb7994360a1a5fecc69e9.png](https://i-blog.csdnimg.cn/blog_migrate/9375b14bd4c38cfcbea833ef0609ddbd.png)
以Python运行环境为例,证明一下:
>>> 5.4-2 == 3.4
False
这么简单的数学题电脑怎么会弄错!?还是我们自己错了?
我们一块深入排查一下,还是以Python运行环境为例:
>>> 5.4-2
3.4000000000000004
咦?怎么多出来了“0.0000000000000004”!?
难怪不相等呢!
![127296dc5974c2a5a27bc398bee088d3.png](https://i-blog.csdnimg.cn/blog_migrate/ea08b27ee374b64bfcff2bdb253c97c7.png)
电脑出毛病了吗?别紧张,是这么回事:
我们在日常生活及大部分编程过程中,采用的都是十进制数,而计算机使用的是二进制数,往往在我们看起来很平常的十进制数,在进制转换过程中,却保不准导致了循环小数的出现,而计算机在存储及运算时,其精度或者说数据的有效位是有限的,超出其精度之外的小数会被截断、忽略,由此导致了准确度的损失。
那么,面对上述问题,我们该怎么办呢?
我们需要给计算机一定的容忍空间,尤其对浮点数进行比较时,在不影响我们实际应用所要求的精度的基础之上,取有限的有效位进行比较。还是以Python为例,我们可以调用round函数对浮点数进行四舍五入,如下所示:
>>> round((5.4-2)-3.4 ,2) == 0
True
简单解释一下,上述代码中的round函数有两个参数,第一个参数可以是一个表达式或者数字,第二个参数则表示对第一个参数的计算结果进行四舍五入后保留的小数点后的有效位数。通过“5.4-2”与“3.4”两者求差,舍弃因计算机的不精确带来的无效位、保留我们可以容忍的有效位(比如,上述代码保留小数点后2位有效数),然后再与0进行比较,就解决了上述问题。
只有彻底摸清楚了电脑的脾气、能力及缺陷,我们方能更好地驾驭、趋利避害,不会不明不白的掉到陷阱里了。
![94e2afcf9bb20e9602c1a7711e7c5a30.png](https://i-blog.csdnimg.cn/blog_migrate/6080aa0365f61d10b370f61181862506.jpeg)
原文:08.“5.4-2为什么不等于3.4?”-数据类型(一)