回答:
数値強制2単位の精度の。floatまたはfloat like datatypeを使用して通貨を表すことは絶対にしないでください。通貨を表すと、財務報告の最終的な数値が+または-数ドルずれると、人々は不満を感じるようになります。
お金の種類は、私が知る限り、歴史的な理由で残っています。
scale - precision
numeric(3,2)
最大を保存できるようになります9.99
3-2 = 1
あなたの情報源は決して公式ではありません。それは2011年までさかのぼります、そして、私さえ著者を認識しません。お金のタイプが公式に「非推奨」である場合、PostgreSQLはマニュアルでそう述べています- それはしません。
より公式なソースについては、pgsql-generalでこのスレッドを読んでください(今週から)、D'Arcy JM Cain(moneyタイプの元の作者)やTom Laneなどのコア開発者からの声明。
最近のリリースの改善に関する関連回答(およびコメント!):
基本的に、money
(非常に限られた)用途があります。Postgresのウィキは、これらの狭義の場合を除き、大部分はそれを避けるために示唆しています。利点numeric
はパフォーマンスです。
decimal
numeric
Postgresの単なる別名であり、通貨データに広く使用されており、「任意精度」タイプです。マニュアル:
この型
numeric
は、桁数が非常に多い数値を格納できます。これは、正確性が要求される金額やその他の量を保存する場合に特に推奨されます。
個人的には、integer
端数セントが発生しない場合(基本的にはお金が意味をなす場合)は、通貨をセントを表すものとして保存します。これは、言及された他のどのオプションよりも効率的です。
money
タイプが実際には非推奨であった場合でもあります。問題が修正され、タイプが新しいバージョンに追加されました。個人的に私integer
はセントを表すものとして通貨を保存するのが好きです。
選択肢は次のとおりです。
bigint
:セントで金額を保存します。これはEFTPOSトランザクションが使用するものです。decimal(12,2)
:小数点以下2桁で金額を格納します。これは、最も一般的な元帳ソフトウェアが使用するものです。float
:ひどい考え-不十分な精度。これは、素朴な開発者が使用するものです。オプション2が最も一般的で、最も扱いやすい方法です。精度(この例では12、つまり全体で12桁を意味します)を、最適な大きさまたは大きさにします。
計算の結果である複数のトランザクション(たとえば、為替レートを含む)をビジネス上の意味を持つ単一の値に集約する場合、正確なマクロ値を提供するために精度を高くする必要があることに注意してください。decimal(18, 8)
合計が正確になり、個々の値をセント精度に丸めて表示できるようにするなどの使用を検討してください。
numeric(15,4)
またはnumeric(15,6)
良い考えです。
私はすべての通貨フィールドを次のように保持しています。
numeric(15,6)
小数点以下の桁数が多すぎることは過度に思われますが、わずかな可能性でも複数の通貨を処理する必要がある場合は、変換にその精度が必要になります。ユーザーに何を提示する場合でも、常に米ドルで保管します。このようにして、当日の換算レートを考えると、他の通貨に簡単に換算できます。
1つの通貨以外に何もしない場合、ここで最悪のことは、いくつかのゼロを格納するために少しのスペースを無駄にしたことです。
bigint
マイクロドル(または同様の主要通貨)を使用することをお勧めします。マイクロは100万分の1を意味するので、1マイクロドル= 0.000001ドルです。
numeric(15,6)
は別の答えで示唆されているのですか?
bigint
。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…がありますが、サポートは限定されており(現時点では)、警告があります(たとえば、通貨換算時にフロートを簡単に掛けることはできません)。 。マイクロドルを使用してJS整数に格納できる最大値が90億ドルであることを考えると、ほとんどの場合、それでもおそらく十分です。