MySQLデータベースの上にPHPで記述されたレガシーコードの巨大な山を継承しました。私が気づいたのは、アプリケーションdoubles
がデータの保存と操作に使用することです。
今、私double
は丸め誤差のために金銭的操作に適していない方法について言及している多くの投稿に出会いました。しかし、PHPコードで金銭的な値を処理し、MySQLデータベースに保存する方法の完全なソリューションにまだ出会っていません。
PHPで具体的にお金を処理する場合のベストプラクティスはありますか?
私が探しているものは:
- データベースにどのようにデータを保存する必要がありますか?列タイプ?サイズ?
- データが通常の加算、減算でどのように処理されるべきか。乗算または除算?
- いつ値を丸めるべきですか?ある場合、どの程度の丸めが許容されますか?
- 大きな金額と低い金額の処理に違いはありますか?
注:日常生活で金銭的価値に遭遇する可能性 のある非常に単純化されたサンプルコード(単純化のためにさまざまなセキュリティ上の懸念は無視されました。もちろん、実際の生活ではこのようなコードは使用しません):
$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed
$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.
$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?
もちろん、このサンプルコードを使用して、より多くのユースケースを引き出す手段として使用してください。
ボーナスに関する質問 DoctrineやPROPELなどのORMを使用する場合、コードでお金を使用することはどの程度異なりますか。
decimal
C#の型は精度に制限がありますが、金額に完全に適しています。