2009-05-23 3 views
8

私はいくつかのお金の価値についていくつかの基本的な計算を行う必要があるいくつかのレポート出力スクリプトに取り組んでいます。私はこの目的のために浮動小数点演算の限界を認識していPHPでお金に関連する計算を安全に行うにはどうすればよいですか?

は、しかし、入力値はすべて10進数形式であるので、私は算術演算子を使用する場合は、それらの上にPHPが山車にそれらをキャストします。

ので、数字を処理するための最良の方法は何ですか? BCMathを使用する必要がありますか? .NETにのようなものがありますか?または、私がintにキャストすると算術演算子を使うのは安全ですか?

+0

これは、コボルが依然として財務に多用されている理由です。小数点以下の数字で簡単に作業できます。 –

答えて

10

はドル($ 1.54)セントで、作業中に作業しないでください。セントの分数が重要な作業を実行する必要がある場合を除き、整数で作業するので、すべてがうまくいきます。 1セントの10分の1に興味があれば、すべてを10倍にしてください!

+9

一般化:あなたの通貨に対してアトミックな単位を使用してください。 – SingleNegationElimination

+0

通貨を換算するには、銀行は8桁の小数点以下を入力します。 –

+0

表示はどうですか?それでも$ 1.54として表示する必要があります。私が1.53または1.55で終わる浮動小数点数のある状況はありますか? – Shabbyrobe

8

あなたはBCMath使用している場合は、すべての値が、結果は文字列になりますと同じように、文字列に格納し、文字列として関数に渡されます。したがって、キャストは必要ありませんが、関数に与えられた数値が値の数値であることを確認してください。個人的には、数学に小数点側の精度が高いが必要な場合は、BCMathを使用します。 (154C):

-4

妥当な金額(「通常の人」まで)で作業している場合は、浮動小数点を使用することは問題ではありません。特に金利を加算したり減算したりするのではなく、計算。

あなたは簡単な修正を探している場合は、整数への切り替えはあなたを助けるためにそうではありません。あなたはまだオーバーフローに対処する必要があります。 (誰かがここで編集したのは、PHPが整数型の境界を超えた数に遭遇した場合、それはinterpreted as a float insteadとなります。しかし、あなたは元の浮動小数点問題に戻りました!)任意の長さの整数ページ)が助けることができる)

基本的には、中途半端な方法でこれを行うことは、ほとんどの場合で動作し、かつ安価です。それを正しく行うことは深刻な痛みです。私の提案は、これをビジネス上の問題と見なすことです。誰かが1セントを逃したと不満を表明し、1ドルを払い、本当の解決策を開始してから、それを行うことでより多くのドルを節約するまでは気にしないでください。

+2

これは間違っています。浮動小数点数はすべての基数10を表すことはできません。少数で簡単な加算/減算を行っても、誤った結果が得られます。 – troelskn

+0

丸められた浮動小数点数は、0.01と1.00の間のすべての数値を表すことができます。 –

関連する問題