2017-11-03 12 views
0

頭のスクラッチャーが少しありました。 CSVの値をロードして浮動小数点数にキャストし、単純な算術演算を行い、結果を4番目の値と比較し、結果が一致しない場合はエラーを記録します。PHPでの比較の問題

$CsvArrayLine[2] = (float) $CsvArrayLine[2]; 
$CsvArrayLine[3] = (float) $CsvArrayLine[3]; 
$CsvArrayLine[4] = (float) $CsvArrayLine[4]; 

$GwTempTotal = $CsvArrayLine[2] + $CsvArrayLine[3]; 
$GwTempTotal = $GwTempTotal * $CsvArrayLine[4]; 
$GwTempGiven = (float) $CsvArrayLine[5]; 

if ($GwTempTotal != $GwTempGiven){ 
    var_dump($GwTempTotal); 
    echo "</br>"; 
    var_dump($GwTempGiven); 
    echo "</br>"; 
    $GwErrorArray[] = array("03","$CsvArrayLine[0]"," $GwTempTotal each cost + pack each cost x pack does not = gross, this is BAD</br>"); 
} 

これはどれもいいですし、29行のうち24行ではうまく動作します。ただし、値が同一であっても、5行はエラーとなります。 var_dumpsからの出力はすべてfloatであり、すべて同じであるということです。

誰かが見ることができない明らかなものはありますか?

+0

ため

おかげで、 ' "[0] $ CsvArrayLine"'のようなものをやって避けるようにしてください。 – tadman

+1

これは浮動小数点エラーの問題ですか?浮動小数点数を比較すると、浮動小数点数を出力するのとは異なる結果になる傾向がありますか? – IncredibleHat

+1

あなたは本当に通貨価値のために浮動小数点を使うべきではありません。丸めエラーと比較エラーが発生します。 https://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currencyおよびhttps://stackoverflow.com/questions/316727/is-a-double-も参照してください。例えば、お金のために本当に不適切なものです。 – Simba

答えて

0

PHPの浮動小数点値の性質は、通常の比較演算子を使用しないでください。代わりに、最小の許容差に決めるなど、比較を使用します。

if (abs(($a-$b)/$b) < 0.00001) { 
    echo "same"; 
} 

(帽子の先端@Joey)

あなたは絶対に「正確な」浮動小数点数の比較を行う必要がありますし、絶対にそれをしなければならない場合PHPでは、あなたの最善の策はBC Math Functionsです。

+0

したがって、通貨計算のための受け取ったロジックは、ペンス/セントに変換し、intのIを仮定することです。 –

+0

@ GarethWestwoodあなたが扱っているのは、小数点以下の桁数がわかっている通貨であれば、整数だけを使用してください。通常の通貨の場合(2桁のペンスの場合はポンド、2桁のセントの場合はドル)の場合に最も簡単なことは、単純に100を掛けて摂取時の小数を生成することです。 –

0

回答した方々のおかげで、すべて正しい方向に私を指摘しました。私は一緒に行った。現金値を扱うすべての行については

$CsvArrayLine[2] = (int) round($CsvArrayLine[2]*100); 

(私は実際にほぼすべてを四捨五入しました!)、それが今より良い全体の多くを動作しているようです。あなたが本当に `$ CsvArrayLine [0]`たいとき再び助け