可能重复:
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
答案 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 功能可用。
答案 2 :(得分:0)
使用Float
echo (float) ( (0.1+0.7) * 10);
它会给你完美和
答案 3 :(得分:0)
尝试
echo (int) round( ( (0.1+0.7) * 10));
这应该补偿浮点计算错误。