不知何故1不等于1(PHP)

时间:2013-09-06 17:16:46

标签: php equality

我有一个关联数组,其值为浮点数,它们应该是概率。因此,我总结它们并要求结果实际上是1。

$total = array_sum($array);
echo '$total = '.$total."\n";
if ($total == 1) {
    die("total is 1");
} else {
    die("total is not 1");
}

这神秘地输出:

$total = 1
total is not 1

执行var_dump($total)会产生float(1),但即使$total == (float)1也会返回false。

发生了什么事?

3 个答案:

答案 0 :(得分:3)

浮点值本质上是不精确的,并且由于它们的存储方式和舍入错误而很少彼此相等。您应该通过查看两个值是否“足够接近”来比较浮点数。也就是说,将两个值之差的绝对值与极小的误差范围(通常称为“epsilon”)进行比较。

一个这样的实现可能是:

if (abs($total - 1) < 0.000000001)
    die("total is 1");
} else {
    die("total is not 1");
}

请注意,只有您的应用程序的要求才能真正确定安全误差范围是什么,以及在什么时候应该舍入数字以进行显示。


如果您正在处理货币值,例如,并且需要精确的精度,则更好的解决方案是完全放弃浮点运算。在这种情况下,一种选择是使用整数类型并将数字存储为美分,仅在最后一分钟显示向用户显示数字(或者甚至不分割,而是在字符串中注入小数点)。 / p>

答案 1 :(得分:2)

php(和其他语言)中的浮点数不准确,因此(float)1可能实际上是1.00000000000000123113.99999999999999823477

有关详细信息,请参阅答案PHP - Floating Number Precision

答案 2 :(得分:1)

施放到int做

if ((int)$total == 1)

它会起作用:)

编辑: 甚至更好

$total = (int)array_sum($array);