1

对于以下

echo 0.02-0.01-0.06+0.05;

我得到的结果是

6.93889390391E-18

对于这个

echo -0.02+0.02;

我得到了结果

0

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

4

5 回答 5

4

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

于 2012-06-27T15:32:26.003 回答
1

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

这种浮点格式不能准确地表示大多数十进制数字。例如,正如小数不能精确表示 1/3(大约是 0.3333,但任何有限长度的十进制数字都在某处结束,所以它与 1/3 略有不同),浮点中使用的二进制数字也不能表示 1 /10 精确(二进制,1/10 大约是 0.000110011001100110011)。

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

如果您想要一个精确的结果,您必须学习浮点运算的详细信息,以便您可以设计避免错误或可以纠正错误的操作,或者您应该只使用整数运算。例如,如果上面表示的美元金额要加减,您可以改为存储美分金额并计算“2-1-6+5”。

于 2012-06-27T18:37:51.663 回答
1

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

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

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

于 2012-06-27T15:34:54.987 回答
0

如果您将其四舍五入到小数点后两位或三位,这将为您解决问题。

于 2012-06-27T15:37:44.723 回答
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
于 2015-05-08T23:13:49.573 回答