web-dev-qa-db-ja.com

データベースにお金の価値を保存するための最良の方法は何ですか?

データベースにいくつかのお金関連のフィールドを保存する必要がありますが、お金10進数の間で使用するデータ型がわかりません。

27
ntombela

小数とお金はかなり信頼できるはずです。 (継承されたアプリケーションからの苦痛な個人的な経験から)私があなたに保証できるのはしないでください floatを使用してください!

40
Rad

私は常にDecimalを使用します。これまでお金を使ったことはありません。

最近、SQLサーバーの小数と金額のデータ型に関する記事を見つけました。興味深いと思われるかもしれません。

お金と小数

また、moneyデータ型を使用して計算を実行すると、必ずしも正確な結果が得られるとは限らないようです: クリック

私が過去にウェルとして行ったことは、INTフィールドを使用し、金額をセント(ユーロセント/ドルセント)で格納することです。

14

私はそれが精度と規模に帰着すると思います。 IIRC、moneyは4dpです。それでよければ、moneyはあなたの意図を表しています。より詳細な制御が必要な場合は、特定の精度とスケールでdecimalを使用してください。

11
Marc Gravell

それはあなたのアプリケーションに依存します!!!私は金融サービスで働いており、通常、価格はポイントから小数点以下5桁まで重要であると考えています。もちろん、3.12345ペンス/セントで数百万を購入するとかなりの金額になります。一部のアプリケーションは、これを処理するために独自のSQLタイプを提供します。

一方で、これは必要ないかもしれません。 <ユーモア>請負業者の料金は常に100ポンドに最も近いように丸められているように見えましたが、現在の信用収縮では25ポンドに最も近いようです。 </ユーモア>

4
AlSki

利用可能なデータ型に基づいて考えを調整しないでください。むしろ、要件を分析してから、どのデータ型が最適かを確認してください。浮動小数点数のバイナリバージョンを格納する際のアーキテクチャの制限を考慮すると、浮動小数点はいつでも最悪の選択です。 Moneyは標準の単位であり、Money関連の操作を処理するためのサポートが確実に増えます。 10進数の場合、すべてを処理する必要がありますが、10進数型を処理しているのはあなただけであることがわかっているため、他の2つのデータ型で得られる驚きはありません。

2
Amber

概算や浮動小数点値による変更が必要ない一部のデータ(お金など)の場合、データが「浮動」しないようにする必要があります。小数点の両側で固定する必要があります。
安全を確保する簡単な方法の1つは、INTEGERデータ型に変換して値を設定し、値を取得するときに小数点が適切な場所に配置されていることを確認することです。
例えば。
1。 $ 240.10をデータベースに保存します。
2。それを純粋な整数形式に変換します:24010(10進数のシフトだけを知っています)。
3。適切な10進状態に戻します。右から2桁に小数点を配置します。 240.10ドル

したがって、データベース内にある間は、厳密な整数形式になります。

1
Satyendra

小数点以下を使用し、必要と思われるよりも多くの小数点以下の桁数を使用して、計算が正しくなるようにします。お金は常に計算で正しい結果を返すわけではありません。これらは不正確なデータ型であり、計算が間違ってしまう可能性があるため、いかなる状況でもfloatまたはrealを使用しないでください(特に複雑になるため)。

1
HLGEM