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

sbu*_*uck 1 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");
}
Run Code Online (Sandbox Code Playgroud)

看起来很简单,但我反复收到来自它的电子邮件,如下所示:

Stored total:23.40

Calculated total:23.40
Run Code Online (Sandbox Code Playgroud)

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

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

Aln*_*tak 11

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

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

$is_equal = (abs($val1 - $val) < 0.001);
Run Code Online (Sandbox Code Playgroud)