以下
echo 0.02-0.01-0.06+0.05;
我的结果是
6.93889390391E-18
对于这个
echo -0.02+0.02;
我得到了结果
0
我想知道为什么我得到了不同的结果。我想要得到两个0
结果。
答案 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