2009-04-17 17 views
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("[email protected]","Total check fail","Stored total:$storedTotal \n\n Calculated total:$calculatedTotal \n\n"); 
} 

这看起来很简单,但是,我多次从它那里得到的电子邮件,看起来像这样:

Stored total:23.40 

Calculated total:23.40 

正如你可以看到,这两个值看起来是一样的。

任何人都可以看到任何他们不显示为平等的原因吗?我没有使用严格的平等检查,所以不应该被类型绊倒。

回答

2

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

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

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

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

由于这些似乎是货币金额,只是检查,他们是彼此的小单位的十分之一内:

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

我在那里看到一个税收变量;我想你是正确的。 – Eddy 2009-04-17 22:51:57

+0

或者更好:从不使用浮点数学计算涉及金钱! – bobince 2009-04-18 02:12:05

+0

当然,但是这是_php_我们在谈论:) – Alnitak 2009-04-18 07:46:14

-2

必须有别的东西,你失踪,我们不看到。可能与浮游物的大小有关。

因为。

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

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

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

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

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

相关问题