错误的计算?

时间:2012-09-27 14:32:40

标签: php

  

可能重复:
  Is double Multiplication Broken in .NET?
  PHP unexpected result of float to int type cast

echo (int) ( (0.1+0.7) * 10); 

给我回答7但不是8。

echo (int) ( (0.1+0.8) * 10); 

给出答案9,这是正确的

怎么了?任何人都可以解释

感谢名单, -Navi

4 个答案:

答案 0 :(得分:2)

尝试

echo (float) ( (0.1+0.7) * 10);

答案 1 :(得分:1)

这是正常的 - 使用浮点数时会有一个称为精度的东西。它出现在大多数现代语言中。有关详细信息,请参见此处:http://www.mredkj.com/javascript/nfbasic2.html

((0.1+0.7) * 10)可能类似于7.9999999(int) 7.9999999 = 7

另一方面,((0.1+0.8) * 10)可能是9.00000001(int)9.00000001 = 9

  

浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播。

     

此外,有理数的数字可以完全表示为   基数10中的浮点数,如0.1或0.7,没有   精确表示为基数2中的浮点数,即   内部使用,无论尾数的大小。因此,他们   没有a就无法转换成它们的内部二进制对应物   精度损失小。这可能导致令人困惑的结果:for   例如,floor((0.1 + 0.7)* 10)通常会返回7而不是   预期8,因为内部表示将是类似的   7.9999999999999991118 ....

     

所以永远不要将浮动数字结果信任到最后一位数,而不是   直接比较浮点数是否相等。如果更高   精度是必要的,任意精度数学函数和gmp   功能可用。

来源:http://php.net/manual/en/language.types.float.php

答案 2 :(得分:0)

使用Float

echo (float) ( (0.1+0.7) * 10); 

它会给你完美和

答案 3 :(得分:0)

尝试

echo (int) round( ( (0.1+0.7) * 10));

这应该补偿浮点计算错误。