对于以下
echo 0.02-0.01-0.06+0.05;
我得到的结果是
6.93889390391E-18
对于这个
echo -0.02+0.02;
我得到了结果
0
我想知道为什么我得到了不同的结果。我想得到两个0
结果。
这就是浮点数的工作原理。
当您在源代码中写入数字“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”。
浮点运算与正常的数学规则并没有真正密切相关。例如,操作不是关联的或分配的。
浮点表示是精度有限的近似值。
这不是特定于 php 的东西 - 计算机根本无法像我们概念化它们那样表示数字。
如果您将其四舍五入到小数点后两位或三位,这将为您解决问题。
嗨,对于遇到这个问题的人,您可以使用 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