2009-04-17 11 views
1

合計が正しいことを確認するスクリプトにチェックを入れます。それは、データベースに格納されているときに合計を調べてから、他の変数を使用して、合計が何であるべきかを計算します。PHPでこの簡単な比較が等しくない理由を図解してください

これらの2つの値(保存された合計と計算された合計)が等しくない場合、問題であるため、電子メールアラートを送信します。ここで

は、私がこれを行うために使用するコードの抜粋です:

$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つの値が同じように見えることがわかります。

誰も同じ理由で表示されない理由を知ることができますか?私は厳密な等価チェックを使用していないので、タイプにつまずくべきではありません。

答えて

2

は、あなたがそれらを比較する前に変換し、丸めてみてください。

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

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

私は今このソリューションを実装していますが、問題を再現できないため、アラートが停止するのを待つだけです。それが機能するかどうかを報告します。 – Susan

+0

これまでのところ、このソリューションでは良いです。 – Susan

11

おそらく浮動小数点の比較エラーです - デフォルトのfloat -> string変換ルーチンは印刷に値するものではないが、比較が失敗するのに十分なほど重要でない数字が多分あるでしょう。あなたはStackOverflowで何十もの同様の質問を見つけるでしょう。

これらはちょうど彼らがお互いのマイナー単位の十分範囲内だことを確認し、通貨額のように見えるとして:

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

私はそこに税の変数を見ます。あなたが正しいと思います。 – Eddy

+0

または、より良い:お金を含む計算に浮動小数点演算を使用しないでください! – bobince

+0

確かですが、これは私たちが話している_php_です。 – Alnitak

-2

そこが欠けている何か他のことが、私たちはありませんしなければなりません見て。おそらく浮動小数点のサイズに関連する何か。

です。

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

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

これは、0.5を基数10から基数2に丸めずに変換できるためです。 '24.40'のようなものを試してみてください。 – Shi

0

私は同じ問題を抱えていた - 私の簡単なデータの一貫性の健全性チェックは、結果として失敗していました。

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

が今私のテストに合格が、私は非常に不幸だ:私はこの単純な機能を実装するためにオリオン座ゼータ星のソリューションを使用していました。 6.60が6.60と等しくないプログラミング言語PHPは私に何をしますか?私はC++に戻ってみたい!

関連する問題