2009-04-17 18 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++!

相關問題