知识卡片

二进制浮点数舍入误差的通用性

专业/工作 · 406

内容

IEEE 754二进制浮点数表示法能精确表示1/2、1/8这类二进制分数,却无法精确表示0.1这类常见的十进制分数,因为十进制小数在二进制下往往是无限循环小数,必须截断存储。这导致0.3-0.2算出来的结果并不等于0.2-0.1(实际结果是0.09999999999999998),两者看起来一样却不相等。这不是某种语言实现的缺陷,而是所有采用IEEE 754标准的编程语言共有的本质限制,源头在于十进制与二进制之间的进制转换损耗。实践中的应对方式是:凡涉及金融计算等要求精确对账的场景,一律用整数最小单位(如”分”而非”元”)运算,避免直接比较浮点数是否相等。

参考来源

《JavaScript权威指南(原书第6版)》第3章《类型、值和变量》