找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3764

积分

0

好友

494

主题
发表于 1 小时前 | 查看: 3| 回复: 0

Python 中存在一个看似违反直觉的现象:0.1 + 0.2 == 0.3 的结果竟然是 False

浮点数运算中0.1+0.2不等于0.3的Python执行结果截图

这背后的根本原因,是计算机底层采用二进制存储数据。像 0.1、0.2、0.3 这类十进制小数,转换成二进制后会变成无限循环小数。硬件存储时,这些无限位数的值必然被截断为有限位数,因此无法做到绝对精确。

十进制小数向二进制转换过程中的精度丢失示意

正因如此,几乎所有的小数在计算机内部表示时,都潜藏着微小的误差。

Python打印20位小数值,暴露0.1到1.2累加中累积的微小误差

这些误差在日常场景中通常小到可以忽略不计,所以不会引起特别注意。然而,当你尝试对浮点数使用等于号(==)进行精确比较时,麻烦就来了——看似应该相等的值,实际上并不相等。

在实际编程中,处理小数比较的通用做法是设定一个容错范围。例如,定义极小值 $10^{-10}$,只要两个数之差的绝对值小于这个范围,就近似认为它们相等。

通过设定极小误差范围来解决浮点数比较问题的Python代码示例

而在对精度要求极高的领域,如金融计算或科学研究,Python 推荐使用自带的 decimal 模块来进行精确的数值控制。

使用decimal模块实现精确的浮点数加法与比较

这里有一个关键点需要格外注意:初始化 Decimal 对象时,参数必须使用字符串格式。如果你直接传入一个浮点数,那得到的 Decimal 对象从源头上就已经携带了误差,后续的计算自然也就不再精确。

在日常开发中还有一种非常巧妙的避坑思路。处理金额时,不直接使用“元”作为浮点数单位进行计算,而是统一转为最小单位,比如“分”,全程用整数进行运算。这样就能从根本上避开小数运算带来的精度困扰。

如果你还在其他场景中遇到过这类因浮点数而生的诡异问题,不妨在评论区分享交流。深入理解这些底层细节,正是我们向更扎实的 Python 开发者进阶的必经之路。




上一篇:Bash 环境变量实用手册:变量赋值、$@、$? 及常用内部变量全解
下一篇:AI服务器引爆MLCC需求:从“夕阳产业”到被高盛称作“下一个存储”
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-6-8 22:03 , Processed in 0.641662 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表