MySQL Decimalデータ型をPHPでどのように使うべきですか?

うまくいけば、ただの簡単な質問です。私は自分のデータベースに DECIMAL という列を持っています。値は非常に小さな小数です。すべての行の値を合計すると1になります。

今私はPHPアプリケーションでこの値を使用して表示し、計算を実行してデータベースに保存し直したいと思います。

phpは integer 型と float 型しか持たないので、計算や表示の正確さを失わないようにphpでその値を使用する最良の方法は何ですか?

  • 値を文字列として保存し、BC計算を計算に使用します
  • 数字を float としてキャスト - phpの浮動小数点数は正確です(OSによって異なる)
  • 指数を記憶する関数を使用して値を整数に変換する
  • 他の何か?

ありがとう

6
それを文字列として保存すると精度は保たれますが、一度計算を開始するとすべてのベットがオフになります。
追加された 著者 Marc B,
BC Math を使用します
追加された 著者 N.B.,

1 答え

float は計算の精度を損なわず、 number_format 出力...

Notes:
It's really depend on your needs and how you want your output handled, if you wish just cutting the mantissa after second number or do some kind of rounding.

たとえば 2.10/1.10 のようなスケール2のBC Mathを使用すると、使用中に 1.90 が生成されます number_format(2.10/1.10,2) 1.91 SELECT CAST(DECIMAL(10,2)として2.10/1.10のように)/code>)

Update:. As stated in comments there may be cases you will lose precision in calculations. It will be probably better to do arbitrary-precision calculations in MySQL itself so you can be sure nothing is loosed during math operations.

0
追加された
@Bendosが任意精度の算術演算を行いたい場合、浮動小数点数を使うのは良い考えではありません。計算のステージに浮動小数点形式で表現できない数値が含まれる場合、精度は失われます。
追加された 著者 Hammerite,
なぜ、何が起こるかなどの説明、賛否両論は何ですか?
追加された 著者 N.B.,
@ハンメリット、ありがとう。私はこれをメモするために私の答えを更新しました
追加された 著者 Juicy Scripter,
この答えの最初の段落は間違っています。原則として、精度が問題になる場合は浮動小数点数を使用しないでください。[PHP Manual]()を参照してください。浮動小数点数は実数の近似値を表します。ほとんどの場合、丸め誤差が発生します。 PHPでは、正確な計算のために文字列とbc_mathを使うべきです。
追加された 著者 stianlik,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com