13

私はいくつかの金額の基本的な計算を行う必要があるいくつかのレポート出力スクリプトに取り組んでいます。

この目的での浮動小数点演算の制限は認識していますが、入力値はすべて 10 進数形式であるため、それらに算術演算子を使用すると、PHP はそれらを float にキャストします。

では、数字を処理するための最良の方法は何ですか? BCMathを使用する必要がありますか? .NETにDecimalに似たものはありますか? または、int にキャストバックする場合、算術演算子を使用しても安全ですか?

4

3 に答える 3

13

ドル ($1.54) ではなく、セント (154c) で作業してください。1 セントの端数が重要なタスクを実行する必要がない限り、整数で作業することになり、すべて問題ありません。10 分の 1 セントに興味がある場合は、すべてを 10 倍するだけです。

于 2009-05-23T02:49:34.570 に答える
12

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

于 2009-05-23T02:29:28.227 に答える
-3

(「普通の人」にとって) 妥当な金額で作業している場合、浮動小数点を使用しても問題になることはほとんどありません。たとえば、利息の計算を行うのではなく、金額を足したり引いたりするだけの場合は特にそうです。

簡単な修正を探している場合、整数への切り替えは役に立たない可能性があります。あなたはまだオーバーフローに対処する必要があります。(誰かがここで編集して、PHP が整数型の境界を超える数値に遭遇した場合、代わりに float として解釈されることを言及しました。しかし、浮動小数点を使用するという元の問題に戻ります!) 任意の長さの整数 (GMP 、そのページから参照) が役立ちます。)

基本的に、中途半端な方法でこれを行うと、ほとんどの場合うまくいき、安価です。それを正しく行うことは深刻な苦痛です。私の提案は、これをビジネス上の問題と見なすことです。誰かが 1 セントも逃したと文句を言ったら、その人に 1 ドルを与えてください。そうすることでより多くのドルを節約できるようになるまで、実際の解決策を考え始める必要はありません。

于 2009-05-23T06:17:06.860 に答える