• 为什么我的数字(例如0.1 + 0.2)加起来不是正好0.3,而是得到一个像0.30000000000000004这样的怪异结果?
  • 因为在内部,计算机使用的格式(二进制 浮点),其不能准确地表示类似于 0.1,0.2或0.3这样的数导致的。
  • 编译或解释代码时,“ 0.1”已经舍入为最接近的数字,即使在计算之前,也会产生小的舍入误差。

为什么计算机使用这种愚蠢的系统

  • 这不是愚蠢的,只是不同。小数不能精确表示1/3之类的数字,因此您必须四舍五入为0.33-并且您不希望0.33 + 0.33 + 0.33加起来等于1-是吗?

  • 计算机使用二进制数是因为它们处理二进制数的速度更快,并且对于大多数计算而言,第17位小数位的错误根本不重要,因为您使用的数字无论如何都不舍入(或精确)。 。

我应该怎么做才能避免这个问题?

  • 这取决于您正在执行哪种计算。
  • 如果您确实需要精确地将结果相加,尤其是在使用金钱时,请使用特殊的十进制数据类型。
  • 如果您只是不想看到所有这些多余的小数位:只需在显示结果时将结果的格式四舍五入到固定的小数位数即可。
  • 如果没有可用的十进制数据类型,则替代方法是使用整数,例如,完全用美分进行货币计算。但这是更多的工作,并且有一些缺点。(这可能是微信支付为什么用分为单位的整数表示钱的原因吧)

为什么其他计算(如0.1 + 0.4)正确运行?

  • 在那种情况下,结果(0.5)可以精确地表示为浮点数,并且四舍五入的输入数中的错误有可能相互抵消-但这不一定是必须的(例如,当这两个数字先存储在大小不同的浮点表示中,舍入误差可能不会相互抵消)。

  • 最后回来,像0.1 + 0.3,结果居然是不是0.4,但结果足够接近0.4。然后,许多语言直接显示该数字,而不是将实际结果转换为最接近的小数。

PHP中的一个解决方法

$a = new Decimal('0.1');
$b = new Decimal('0.2');
echo $a + $b;