弄清楚为什么这个简单的比较在PHP中显示不相等

时间:2009-04-17 22:44:03

标签: php

我在一个脚本中检查确保总数是正确的。它的作用是查看存储在数据库中的总数,然后使用其他变量计算总数。

如果这两个值 - 存储的总数和计算的总数 - 不相等,则会出现问题,因此我希望它发送电子邮件警报。

以下是我用来执行此操作的代码片段:

$storedTotal     = $row['total']; # Pulls from a varchar field in the database
$calculatedTotal = $subtotal + $tax + $shipping - $deduct;

# Make sure the stored total equals what it should (the calculated total)
if($storedTotal != $calculatedTotal) {
    # Send an alert
    mail("admin@domain.com","Total check fail","Stored total:$storedTotal \n\n Calculated total:$calculatedTotal \n\n");
}

看起来很简单,然而,我反复收到来自它的电子邮件:

Stored total:23.40

Calculated total:23.40

如您所见,这两个值看起来是一样的。

任何人都可以看到他们没有表现出平等的原因吗?我没有使用严格的相等检查,因此不应该在类型上绊倒。

4 个答案:

答案 0 :(得分:11)

这很可能是一个浮点比较错误 - 可能有一些非常微不足道的数字,默认的float -> string转换例程认为不值得打印,但这些数字足以导致比较失败。你会在StackOverflow上找到几十个类似的问题。

由于这些似乎是货币金额,只需检查它们是否在彼此的十分之一小范围内:

$is_equal = (abs($val1 - $val) < 0.001);

答案 1 :(得分:2)

在比较之前尝试转换和舍入:

$storedTotal        = round(floatval($storedTotal), 2);
$calculatedTotal    = round(floatval($calculatedTotal), 2);

if ($storedTotal != calculatedTotal) {
...

答案 2 :(得分:0)

我遇到了同样的问题 - 我的简单数据一致性检查结果是失败的。我使用Alnitak的解决方案来实现这个简单的功能:

function not_equals($val1, $val2)
{
    return (abs($val1 - $val2) > 0.001);
}

现在我的考试通过,但我很不高兴。一种编程语言,其中6.60不等于6.60 ??? PHP会对我做什么?我想回到C ++!

答案 3 :(得分:-2)

你必须有一些其他缺失的东西,我们没有看到。可能与浮子的大小有关。

由于

$test = "24.50";
$test2 = 24.50;

var_dump($test == $test2); // bool(true)