0.1+0.2竟然不等于0.3?!

大家好,欢迎来到编程教室~

Python 里有一个大“bug”,0.1+0.2==0.3 的结果竟然是 False:

a7bdd493b19ea3ba29bde6b847fa54b2.png

这个现象的原因在于:计算机底层是以二进制来存储数据,但像0.1、0.2、0.3这样的小数,转成二进制是无限循环的,在计算机里表示必须被截断成有限位数,无法精确表示。

5fa630e9224f8a180ef09f5923986e9c.png

所以这是计算机表示小数时的精度有限而造成的,几乎所有的小数都存在微小的误差。

a6653045f58333e4dd34a5faf6df66d3.jpeg

这种误差非常小,在日常的使用中几乎没有影响,所以平常不会特别引入注意。但是如果要对小数进行数值相等「==」比较时,就会出现看似相等而实际不等的情况。

因此,在代码中比较小数时,通常会定义一个误差范围,比如10的负10次方。当两个数的差小于这个误差范围时,就近似地认为他们是相等的。

4384c8c188bbd289b5fd9c974290de5d.png

而对于金融、科研等精度要求比较高的领域,可以使用自带的decimal模块来准确控制精度。

0aeda75e9129ae234150ca6fa4d57e07.png

不过这里额外提醒一下,在初始化Decimal类型对象时需要以字符串作为参数,不然用浮点数的话,得到的数值依然是带有误差的。

在日常中,还有一种简单的处理方法,就是类似涉及金钱数值时,直接以最小单位「分」作为计量单位而不用「元」,以此来避免进行小数的运算,这样就可以避开这个坑了。

关于计算机中的小数运算误差,你还遇过什么样的情况?欢迎在留言区讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crossin的编程教室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值