当对乘法结果进行布局时,我得到的结果与放置正常数字时的结果不同。这种行为有望吗?如果是,为什么?
$val1 = 29;
$val2 = 0.29*100;
echo floor($val1); // prints 29
echo floor($val2); // prints 28
答案 0 :(得分:4)
这是PHP中浮点精度的结果,在您的示例中:
gettype($val1);
返回integer
和
gettype($val2);
返回double
将它与php.net上的此警告相结合:
此外,有理数的数字可以完全表示为 基数10中的浮点数,如0.1或0.7,没有 精确表示为基数2中的浮点数,即 内部使用,无论尾数的大小。因此,他们 没有a就无法转换成它们的内部二进制对应物 精度损失小。这可能导致令人困惑的结果:for 例如,floor((0.1 + 0.7)* 10)通常会返回7而不是 预期8,因为内部表示将是类似的 7.9999999999999991118 ....
取自http://php.net/manual/en/language.types.float.php
我们可以看到为什么你的楼层从28.9999999999等下降到28,而不是29到29的整数。
答案 1 :(得分:3)
这是PHP奇怪的预测的一部分。它取决于机器是否正常。
浮点数的精度有限。虽然它取决于系统,但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://techiedan.com/2013/10/11/php-floor-function-float-value/