返回

揭秘 0.1 + 0.2 ≠ 0.3 的惊人秘密

前端

您可能曾经遇到过一个困惑:当您在计算机上将 0.1 和 0.2 相加时,它可能不等于 0.3。这看似简单的数学操作背后隐藏着计算机处理浮点数时的一个微妙而迷人的世界。

浮点数的二进制表示

计算机使用二进制表示数字,这意味着它们使用 0 和 1 来表示任何数字。浮点数使用科学记数法表示,例如 0.1 = 1 * 10^-1。要将其转换为二进制,我们会先转换为指数形式:

0.1 = 1/10 = 0.00011001100110011... (二进制)

定点数表示和舍入误差

计算机通常使用称为定点数的二进制表示形式,其中固定位数用于整数和小数部分。例如,一个 32 位定点数可能将前 24 位用于整数,后 8 位用于小数部分。

当将 0.1 转换为定点数时,由于小数部分有限,我们只能存储其近似值:

0.1 = 0.00011001100110011... (二进制)0.0001100110011001 (定点数,舍入)

浮点数的 IEEE 754 标准

为了解决定点数表示中的舍入误差,计算机行业制定了 IEEE 754 浮点数标准。该标准指定了表示浮点数的特定格式,其中包括:

  • 符号位:表示数字是正数还是负数
  • 指数:表示小数点的指数位置
  • 尾数:表示小数部分

根据 IEEE 754,0.1 表示为:

0 10000000 0111100110011001100110011001100110011001100110011010

0.1 + 0.2 ≠ 0.3 的原因

现在,让我们了解为什么 0.1 + 0.2 ≠ 0.3。当我们将 0.1 和 0.2 转换为浮点数时,我们将获得:

0.1 = 0 10000000 01111001100110011001100110011001100110011010
0.2 = 0 10000000 01111001100110011001100110011001100110100011

相加得到:

1.0000000000000000000000000000000000000000000000010001

由于尾数位数有限,该结果被舍入为:

1.0000000000000000000000000000000000000000000000010000

将其转换回十进制,我们得到:

1.00000000000000000000000000000000000000000000000010000 = 0.2999999999999999889

因此,由于浮点数表示的舍入误差,0.1 + 0.2 实际上等于 0.2999999999999999889,而不是 0.3。

应对舍入误差

了解浮点数的舍入误差至关重要。处理浮点数时,可以采取一些措施来应对:

  • 避免使用 == 进行相等比较。转而使用允许小误差的近似比较。
  • 在计算中使用高精度的库。
  • 使用大数表示形式,例如 BigDecimal 或 Rational。

通过理解浮点数的工作原理和采取适当的措施来处理舍入误差,您可以确保在计算机程序中准确处理数字。