原因
这个问题涉及到浮点数在计算机中的表示方式,特别是 IEEE 754 浮点数标准。在 Python(以及其他许多编程语言)中,浮点数并不是以精确的十进制形式存储,而是以二进制近似值存储。这种近似可能导致某些看似简单的浮点运算产生看似不精确的结果。
具体到例子:
0.1
在二进制下不能被精确表示,其最接近的 IEEE 754 浮点数表示形式会存在一定的舍入误差。- 同理,
0.2
也不能被精确表示为二进制浮点数,同样存在舍入误差。 - 当您将这两个近似的浮点数相加时,各自的舍入误差可能相互叠加,导致最终结果不是预期的精确的十进制值
0.3
,而是略大于0.3
的一个浮点数,如您所见的0.30000000000000004
。
而 0.1 + 0.3
的情况有所不同:
- 尽管
0.1
和0.3
分别作为独立的浮点数表示时都有舍入误差,但它们相加的结果0.4
可以被精确地表示为一个二进制浮点数,没有额外的舍入误差累积。
这就是为什么 0.1 + 0.2
等于 0.30000000000000004
,而 0.1 + 0.3
等于 0.4
的原因。实际上,任何涉及浮点数的运算都可能存在类似的问题,特别是在进行比较或需要高精度结果的场景中。
解决此类问题的方法通常包括:
- 使用合适的数值类型,如 Python 中的
decimal
模块,它可以提供任意精度的十进制算术。 - 对于精度要求不高的场景,可以设定一个合理的误差范围(如
1e-6
),在比较浮点数时允许一定范围内的差异。 - 如果是在进行统计计算或数据分析,可以考虑使用专门针对这类任务设计的库(如 NumPy),它们通常提供了处理浮点数精度问题的机制。
总之,浮点数在计算机中的不精确表示是造成您所观察到现象的根本原因。理解这一原理有助于在编写涉及浮点数计算的代码时采取适当的应对措施。
可以使用 math.isclose(0.1 + 0.2, 0.3) 替换这个判断