在PHP中的floor()不工作

时间:2016-01-18 12:54:20

标签: php floor

<?php
    echo gettype ( 5.00 );                                  // return double
    echo gettype((5));                                      // return integer
    echo gettype(((167.00-158.65)/167.00*100));             // return double

    echo floor(5.00);                                       // return 5
    echo floor(5);                                          // return 5
    echo ((167.00-158.65)/167.00*100);                      // return 5
    echo floor(((167.00-158.65)/167.00*100));               // return 4



    var_dump(5.00);                                         // return float(5)
    var_dump(5);                                            // return int(5)
    var_dump((167.00-158.65)/167.00*100);                   // return float(5)
    var_dump(intval(5));                                    // return int(5)
    var_dump(intval((167.00-158.65)/167.00*100));           // return int(4)

    echo gettype(intval(((167.00-158.65)/167.00*100)));     // return integer
    echo floor(intval((167.00-158.65)/167.00*100));         // return 4
?>

为什么php中的floor函数在最后一种情况下不起作用?

如何从上次发言中获取5? 在PHP中是否有任何其他功能或方法可以获得最少的金额?

2 个答案:

答案 0 :(得分:4)

该行为是由浮点数的精度有限引起的。最后一种情况是float类型(用var_dump检查),手册说:

  

警告

     

浮点数的精度有限。虽然这取决于   在系统中,PHP通常使用IEEE 754双精度格式,   由于订单的舍入,这将产生最大的相对误差   1.11e-16。非基本算术运算可能会更大   错误,当然,必须考虑错误传播   几个操作复杂化。

     

此外,有理数的数字可以完全表示为   基数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

答案 1 :(得分:2)

floor()值四舍五入为下一个最小整数。 floor()的返回值仍然是float类型,因为float的值范围通常大于整数的值。如果发生错误(例如传递数组),此函数返回FALSE。

<?php
echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4
?>