2013-03-13 9 views
5

控除後に税額を計算するための小さなスクリプトを作成しています。 私のアプリケーションには、CRUD機能を提供するいくつかのPHPスクリプトがあります。 毎月の経費と請求された総収入を加えて、どれくらいの法人税が拠出されているかを計算することができます。PHP計算に欠陥がある

計算を行う際に、データのすべてがデータベースに格納されている、しかし私はそれを再現することができるように、私は、以下のコードを簡素化します、興味深い問題に出くわした:

$total = 1.0; 
$tax = 0.2; 
$expenses = 0.05; 

echo (($total-$tax) + $expenses); // this echo's 0.85 
// (1.0 - 0.2) + 0.05 

if((($total-$tax) + $expenses) == 0.85) { 
    echo "totals add up"; 
} 
else { 
    echo "accounting error"; 
} 

アイデアすべての合計がパーセンテージとして計算されるということです。 1.0は収益の100%、問題の月の費用は5%です(実際のところ計算には少し複雑です)私は私の計算を得ることができます。

したがって、100%(収益) - 20%(法人税)+ 5%(費用請求)は、合計の85%を私に残すべきです。最初のエコー状態が示すように。

ifステートメントがトリップして「会計エラー」と表示されます。ここで何が起きてるの?

+1

IEEE754浮動小数点数では、通常の問題です。基本的には、そこには平等がありません。私が何を意味するかを見るには、 'echo(($ total- $ tax)+ $ expenses);'行を参照してください... – ppeterka

+0

@ppeterka私はすでに持っていますエコー、それを印刷する0.85 – Husman

+2

[すべてのプログラマが浮動小数点について知るべきこと](http://floating-point-gui.de/) – Barmar

答えて

4

これは、浮動小数点計算の一般的な問題です。要約すると、10進数のいくつかはバイナリで正確に記述することはできません。

一般的な解決策は、整数に固執し、セントですべてを計算し、100

1
あなたがしたいことがあり

PHPのBCMath拡張子を調べてください。私はこのサイトを検索し、質問hereを見つけることによって参照を見つけました。

関連する問題