2012-01-13 8 views
3

よく討議されているように(例えばここではStoring 0.00001 in MySQL)、勘定残高などの精度/正しさが必要なフィールドにはDECIMALデータ型を使用する必要があります。PHPでのMySQL DECIMALの処理

しかし、PHPがこれらの値をどのように処理し、内部で浮動小数点として扱われているのか、データベースからこれらの値を読み込み、計算をやり直して再度書き込む際に問題があるかどうかは疑問でした。もしそうなら、我々はどのようにして正確に精度を保つことができますか?

+0

データベースに入力する際に​​、MySQLクエリ内ですべての計算を実行するようになりました。いくつかの不正確さはまだ残っているので、別のところに問題があるかもしれませんが、それは私が推測する別の質問です。 –

答えて

3

おそらく変数は、PHPの最初の文字列です(MySQLの結果オブジェクトから読み取った場合)。一般に、PHPの浮動小数点データ型は、必要な正確な小数値を保持するために使用することはできません。 GMPのような任意精度の数学ライブラリを使うべきです。 (結果オブジェクトの行をフェッチするときは、適切なコンストラクタにDECIMALの列の値を渡して、使用しているライブラリが提供する関数を使用して操作してください)。

データベースに格納されている金額がDECIMAL(6, 4)の列にあります。あなたはそれをPHPに取り込み、何かをしたいと思っています。その列をフェッチするためにクエリを発行します。クエリの最初の行を連想配列にフェッチします。その行の値が2.5674であるとします。あなたの配列はarray('MyDecimal' => '2.5674')のようになりました(数字は文字列として表示されます)。 (私が知る限り)を使用して、その文字列をGMPリソースに変換します。今では、他のGMP関数を使ってその数で数学を行うことができます。 GMP番号を保存する場合は、gmp_strval()を使用して文字列に変換し直すことができます(GMPリソースを処理できるデータベース抽象レイヤーを使用している場合は、これを行う必要はありません)。あなたは、任意の精度の機能を使用して試みることができる

1

http://php.net/manual/en/book.bc.php

あなたの他のオプションは、のINTとして値を格納し、その後、彼らは(百によって、すなわち、除算)を表示する必要があるときにそれらを変換することです。