0.1+0.2为何不等于0.3?浮点误差揭秘
Adding Floating-Point Decimals for Fun and Profit
大家都知道用浮点数计算美元和美分会有舍入误差,比如 0.1 + 0.2 在 Python 中会得出 0.30000000000000004。但我在日常处理收据时,发现这些微小误差往往并不显现,甚至呈现出有趣的规律。本文深入剖析 IEEE double-precision floats 的内部结构,从二进制表示、ulp(最后一位单位)到舍入规则,一步步拆解 0.1 + 0.2 的计算过程。通过数学推导和可视化图表,揭示了浮点加法误差的分布模式,解释了为何在某些范围内误差会相互抵消,而在另一些区域则形成棋盘格状的误差图。这不仅是对编程常识的补充,更是对计算机底层算术机制的一次生动探索。
0.1 + 0.2 并不等于 0.3,而是 0.30000000000000004,这是因为十进制小数无法被精确表示为大多数编程语言中的浮点数。