22

私はPHPで通貨の表示と数学を処理する方法に悩まされており、長い間、DECIMALタイプを使用してMySQLに保存money_format()し、Webページに表示するためにフォーマットするために使用してきました。しかし、今日私は実際のプロトタイプを見ました:

string money_format ( string $format , float $number )

私は今少し混乱しています。私が言われたのは、お金のために山車を避けることだけです!しかし、これが基本的なフォーマット関数(たとえば、5倍高速)であり、入力をfloatにキャストします。number_format()同じことをします。

だから私の質問は:

  1. 数セントまたは数兆ドルを扱っている(そしてどちらも扱っていない)場合を除いて、フロートにキャストされた通貨の表示保存(ただし数学は行わない)についてはまったく心配する必要がありますか?浮動小数点の不正確さが私の数字を変える領域に近づくことはありますか?

  2. #1の答えが私が本当に心配すべきであるということであるなら、なぜmoney_format()このように構築されているのでしょうか?

4

1 に答える 1

24

数セントまたは数兆ドルを扱っている(そしてどちらも扱っていない)場合を除いて、フロートにキャストされた通貨の表示と保存(ただし数学は行わない)についてはまったく心配する必要がありますか?浮動小数点の不正確さが私の数字を変える領域に近づくことはありますか?

純粋な丸め/表示の目的では、絶対浮動小数点表現の誤差が0.005ドル未満である限り、安全です(したがって、最も近いセントへの丸めが正しい)。

IEEE 754単精度を使用すると、最大$131,072.00の安全性が得られます。($ 131,072.01は131072.015625として表され、誤って切り上げられます。)

倍精度(PHPがfloat使用)は、70,368,744,177,664.01ドル(セントに対して.015625もあります)まで失敗しません。心配することは何もありません。

#1の答えが私が本当に心配する必要があるということであるなら、なぜmoney_format()がこのように構築されているのですか?

どのタイプを取るべきですか?PHPには10進型が組み込まれていません。他の多くの言語もそうではありません。

于 2011-01-12T01:54:20.577 に答える