知识卡片

浮点数的尾数指数表示与精度陷阱

专业/工作 · 740.b

内容

浮点数在计算机中以尾数和指数的形式存储(类似科学记数法,只是底数是2而非10),这种表示法无法精确存储绝大多数十进制小数,只能存一个足够接近的近似值。因此1.1 + 0.1算出来的近似值和字面量1.2存储的近似值在二进制层面并不相等,==比较会返回false,即使打印出来两者都显示为”1.2”。这不是Swift的bug,而是IEEE浮点表示法的通用限制,几乎所有语言都有同样的现象。发散:正因如此,涉及金额等要求精确的场景应避免用浮点数存储,而应使用定点数或整数(如以”分”为单位)表示。

参考来源

《Swift编程权威指南》第4章《数》