PHP数量计算,结果奇怪

时间:2012-06-27 15:30:43

标签: php numbers

以下

echo 0.02-0.01-0.06+0.05;

我的结果是

6.93889390391E-18

对于这个

echo -0.02+0.02;

我得到了结果

0

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

5 个答案:

答案 0 :(得分:4)

这就是floating point numbers的工作方式。

答案 1 :(得分:1)

浮点运算并不真正与正常的数学规则强烈相关。例如,操作不是关联的或分配的。

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

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

答案 2 :(得分:1)

在源代码中写入数字“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”。

答案 3 :(得分:0)

如果将它四舍五入到两位或三位小数,这将为您解决。

答案 4 :(得分:0)

嗨,只是有人提到这个问题,你可以使用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