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

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

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

这些误差在日常场景中通常小到可以忽略不计,所以不会引起特别注意。然而,当你尝试对浮点数使用等于号(==)进行精确比较时,麻烦就来了——看似应该相等的值,实际上并不相等。
在实际编程中,处理小数比较的通用做法是设定一个容错范围。例如,定义极小值 $10^{-10}$,只要两个数之差的绝对值小于这个范围,就近似认为它们相等。

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

这里有一个关键点需要格外注意:初始化 Decimal 对象时,参数必须使用字符串格式。如果你直接传入一个浮点数,那得到的 Decimal 对象从源头上就已经携带了误差,后续的计算自然也就不再精确。
在日常开发中还有一种非常巧妙的避坑思路。处理金额时,不直接使用“元”作为浮点数单位进行计算,而是统一转为最小单位,比如“分”,全程用整数进行运算。这样就能从根本上避开小数运算带来的精度困扰。
如果你还在其他场景中遇到过这类因浮点数而生的诡异问题,不妨在评论区分享交流。深入理解这些底层细节,正是我们向更扎实的 Python 开发者进阶的必经之路。
|