当比较相同的值时,PHP返回false

时间:2016-06-02 07:35:39

标签: php

    $totalFileFloat = (float) (str_replace(',', '', $totalFile));
    $total = (float) ($total);
    var_dump([$totalFileFloat, $total]);
    var_dump($totalFileFloat != $total);
    var_dump($totalFileFloat !== $total);
    var_dump($totalFileFloat === $total);
    var_dump($totalFileFloat == $total);

代码的结果是:

array(2) { [0]=> float(183024.22) [1]=> float(183024.22) }

bool(true)
bool(true)
bool(false)
bool(false)

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:0)

文档说不要比较浮点数,但如果需要比较,可以使用bccomp(http://php.net/manual/en/function.bccomp.php

这里的例子是:

<?php
$a = 0.17;
$b = 1 - 0.83; //0.17

echo "$a == $b (core comp oper): ", var_dump($a==$b);
echo "$a == $b (with bc func)  : ", var_dump( bccomp($a, $b)==0 );



Result:
    0.17 == 0.17 (core comp oper): bool(false)
    0.17 == 0.17 (with bc func)  : bool(true)

答案 1 :(得分:0)

这可能是因为$ total和$ totalFileFloat不完全相同。 var_dump显示它是相同的,但事实上并非如此。另请参阅http://php.net/manual/en/language.types.float.php#113703

答案 2 :(得分:0)

floating point数字有限precision

看看我的例子

<?php
$x = 8 - 6.4;  // which is equal to 1.6
$y = 1.6;
var_dump($x == $y); // output bool(false)

var_dump(round($x) == round($y)) // output bool(true)
?>

根据[{1}} Php,我们不应直接比较manual nubers。欲了解更多信息,请访问 http://php.net/manual/en/language.types.float.php