我在一个脚本中检查确保总数是正确的。它的作用是查看存储在数据库中的总数,然后使用其他变量计算总数。
如果这两个值 - 存储的总数和计算的总数 - 不相等,则会出现问题,因此我希望它发送电子邮件警报。
以下是我用来执行此操作的代码片段:
$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
如您所见,这两个值看起来是一样的。
任何人都可以看到他们没有表现出平等的原因吗?我没有使用严格的相等检查,因此不应该在类型上绊倒。
答案 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)