ALH*_*ALH 2 php floating-point rounding
为什么地球上的PHP会将结果转换(int) ((0.1+0.7)*10)为7而不是8?我知道结果将是(float) 8什么时候它的(int)结果将是7?为什么会这样?
Hai*_*lei 11
一切都是关于float.请参阅PHP:浮点数:
警告 - 浮点精度
浮点数的精度有限.虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差.非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播.
另外,可以精确表示为基数10中的浮点数的有理数,如0.1或0.7,不具有精确表示为基数2中的浮点数,其在内部使用,无论尾数的大小.因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物.这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)*10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....
因此,永远不要将浮点数结果信任到最后一位,并且不要直接比较浮点数是否相等.如果需要更高的精度,可以使用任意精度数学函数和gmp函数.
补充阅读: