PHP数字计算,奇怪的结果


PHP number calculation, strange result

对于以下内容

echo 0.02-0.01-0.06+0.05;

我得到的结果是

6.93889390391E-18

对于这个

echo -0.02+0.02;

我得到了结果

0

想知道为什么我得到了不同的结果。我想得到两个0结果。

这就是浮点数的工作原理。

浮点运算与正常的数学规则并没有很强的相关性。例如,操作不是关联性的或分布性的。

浮点表示是精度有限的近似值。

这不是PHP特定的东西 - 计算机根本无法像我们概念化的那样表示数字。

当您在源代码中编写数字"0.02"时,编译器或解释器使用浮点来表示它们。最常见的浮点格式是 IEEE 754 二进制浮点,可以是单精度或双精度。

此浮点格式不能准确表示大多数十进制数字。例如,正如小数不能准确地表示 1/3(它大约是 .3333,但任何有限长度的十进制数字在某处结束,因此它与 1/3 略有不同),浮点中使用的二进制数字不能准确地表示 1/10(在二进制中,1/10 大约是 .000110011001100110011)。

因此,当您编写"0.02-0.01-0.06+0.05"时,计算机并没有对这些数字进行算术运算。它使用近似值。所以你得到的结果是一个近似的。

如果你想要一个确切的结果,你必须学习浮点运算的细节,以便你可以制作避免错误或可以纠正错误的运算,或者你应该只使用整数算术。例如,如果上面表示的美元金额要相加和相减,则可以改为存储便士金额并计算"2-1-6+5"。

如果您将其四舍五入到小数点后两位或三位,这将为您修复它。

嗨,

只是为了遇到这个问题的人,您可以使用 BCMath 库中的任意精度函数http://php.net/manual/en/ref.bc.php

echo 12606.69 + 3053.46 - 15660.15;
1.8189894035459E-12

echo bcadd((12606.69 + 3053.46),-15660.15);
0