PHP floor()奇怪的行为

时间:2015-12-27 21:34:01

标签: php debugging floor

当对乘法结果进行布局时,我得到的结果与放置正常数字时的结果不同。这种行为有望吗?如果是,为什么?

$val1 = 29;
$val2 = 0.29*100;

echo floor($val1); // prints 29
echo floor($val2); // prints 28

2 个答案:

答案 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/