money
型は貨幣金額を固定精度の小数点で格納します。
表 8.3を参照してください。
小数点精度はデータベースのlc_monetary設定で決定されます。この表が示すように範囲は小数点2桁を想定しています。
'$1,000.00'
などの典型的な通貨書式の他、整数、浮動小数点リテラルなど様々な書式の入力を受け付けます。
出力形式は通常は後者となりますが、ロケールによって異なります。
表8.3 通貨型
型名 | 格納サイズ | 説明 | 範囲 |
---|---|---|---|
money | 8バイト | 貨幣金額 | -92233720368547758.08 から +92233720368547758.07 |
このデータ型の出力はロケールにより変動しますので、lc_monetary
設定が異なるデータベースにmoney
データをロードする場合には動作しない可能性があります。
この問題を防ぐためには、ダンプを新しいデータベースにリストアする前に、lc_monetary
がダンプを行ったデータベースと同じまたは等価であることを確認してください。
numeric
、int
そしてbigint
型はmoney
型にキャストすることができます。real
型やdouble precision
型は最初にnumeric
型にキャストした後に行なう必要があります。以下に例を示します。
SELECT '12.34'::float8::numeric::money;
しかしこれは推奨されません。浮動小数点数値は丸め誤差の可能性がありますので貨幣を扱うために使用すべきではありません。
money
型の値は精度を落とすことなくnumeric
にキャストすることができます。
他の型への変換では精度を落とす可能性があり、また2段階で行う必要があります。
SELECT '52093.89'::money::numeric::float8;
money
型の値を整数型の値で除算すると、小数部分を0に切り捨てるように実行されます。
四捨五入した結果を得るためには、小数部分を持つ値で割り算するか、割り算を行う前にmoney
型の値をnumeric
型にキャストし、あとでmoney
型に戻します。
(精度を落とすリスクを避けるため、後者の方が好ましいです。)
money
型の値を別のmoney
型の値で除算すると、結果はdouble precision
型(通貨ではなく純粋な数値)になります。
除算では通貨の単位は相殺されます。