19

そこで、お金をたくさん扱うアプリケーション(PHP/MySQL)を作ろうと考えており、PHPのfloatデータ型やMySQLの10進数を参考にしながら、お金をどうやって貯めて運用していくかを考えています。

2つの選択肢を考えていました。そのうちの 1 つは、浮動小数点数の不正確さを処理せず、DB にも整数として格納するために、通貨を整数セント形式 ($dollars * 100) で操作および格納することです。もう 1 つは、DB に 10 進数として格納し、計算に PHP で BC Math を使用することです。

そのため、どのオプションを使用するのが最適かを一晩中グーグル検索しましたが、明確な答えは見つかりませんでした。私が見た唯一の合理的なオプションは、整数のセント 1 でした (これは、ブラウザーに表示するたびに DB に保存する前に、ドルからセントに、またはその逆に多くの変換を行うことを意味するため、あまり好きではありません)。

また、MySQL の 10 進数 (MySQL は 10 進数を文字列として格納し、浮動小数点数として操作するなど) について不満を言う人もいますが、それは古い投稿でした。MySQL のドキュメントによると、現在のバージョンは小数を正しく処理しますが、唯一の不満は、宣言された小数部の長さを超える値の小数部を切り捨てることでした (たとえば、decimal(9,2) と宣言された列に 12.326 の値を格納する場合)。 、しかし、私の調査では、単に切り捨てるのではなく丸めます (12.326 は 12.33 になります)。これは私の意見では正しいです。

また、お金を小数として格納し、PHP BCMath を使用して計算を行うことに関する推奨事項は見つかりませんでした。これは、BC および GMP 数学関数について知っている人がほとんどいないためだと思います。

では、精度、速度 (BCMath の計算速度、MySQL の 10 進速度と整数)、およびプログラミングの快適さを考慮して、どのオプションを使用するのが最適でしょうか?

4

2 に答える 2

4

私は間違いなく int を使用し、データ オブジェクト (ORM) スタイルを介してすべてをルーティングし、すべての変換を処理します。データ オブジェクトを使用するクライアント コードは変換を行う必要がなく、気にする必要もありませんが、int は DB によって簡単に処理されるため、ストレージに問題はありません。さらに、お金のオブジェクトに必要な他のメソッド (お金の種類間の変換など) を簡単に追加できます。

于 2009-07-04T11:09:38.687 に答える
1

また、BCMathに関する情報を見つけるのに苦労したので、それについて調査し、自分の記事を書きました:http: //www.exploringbinary.com/base-conversion-in-php-using-bcmath/

(私はあなたがBCMathを使うべきであるという立場をとっていません-私はあなたに情報を与えるだけです。)

于 2009-07-04T19:08:37.603 に答える