The <type>money</type> type stores a currency amount with a fixed
fractional precision; see <xref
linkend="datatype-money-table"/>. The fractional precision is
determined by the database's <xref linkend="guc-lc-monetary"/> setting.
The range shown in the table assumes there are two fractional digits.
Input is accepted in a variety of formats, including integer and
floating-point literals, as well as typical
currency formatting, such as <literal>'$1,000.00'</literal>.
Output is generally in the latter form but depends on the locale.
money
型は貨幣金額を固定精度の小数点で格納します。
表 8.3を参照してください。
小数点精度はデータベースのlc_monetary設定で決定されます。この表が示すように範囲は小数点2桁を想定しています。
'$1,000.00'
などの典型的な通貨書式の他、整数、浮動小数点リテラルなど様々な書式の入力を受け付けます。
出力形式は通常は後者となりますが、ロケールによって異なります。
表8.3 通貨型
型名 | 格納サイズ | 説明 | 範囲 |
---|---|---|---|
money | 8バイト | 貨幣金額 | -92233720368547758.08 から +92233720368547758.07 |
Since the output of this data type is locale-sensitive, it might not
work to load <type>money</type> data into a database that has a different
setting of <varname>lc_monetary</varname>. To avoid problems, before
restoring a dump into a new database make sure <varname>lc_monetary</varname> has
the same or equivalent value as in the database that was dumped.
このデータ型の出力はロケールにより変動しますので、lc_monetary
設定が異なるデータベースにmoney
データをロードする場合には動作しない可能性があります。
この問題を防ぐためには、ダンプを新しいデータベースにリストアする前に、lc_monetary
がダンプを行ったデータベースと同じまたは等価であることを確認してください。
Values of the <type>numeric</type>, <type>int</type>, and
<type>bigint</type> data types can be cast to <type>money</type>.
Conversion from the <type>real</type> and <type>double precision</type>
data types can be done by casting to <type>numeric</type> first, for
example:
numeric
、int
そしてbigint
型はmoney
型にキャストすることができます。real
型やdouble precision
型は最初にnumeric
型にキャストした後に行なう必要があります。以下に例を示します。
SELECT '12.34'::float8::numeric::money;
However, this is not recommended. Floating point numbers should not be used to handle money due to the potential for rounding errors. しかしこれは推奨されません。浮動小数点数値は丸め誤差の可能性がありますので貨幣を扱うために使用すべきではありません。
A <type>money</type> value can be cast to <type>numeric</type> without
loss of precision. Conversion to other types could potentially lose
precision, and must also be done in two stages:
money
型の値は精度を落とすことなくnumeric
にキャストすることができます。
他の型への変換では精度を落とす可能性があり、また2段階で行う必要があります。
SELECT '52093.89'::money::numeric::float8;
Division of a <type>money</type> value by an integer value is performed
with truncation of the fractional part towards zero. To get a rounded
result, divide by a floating-point value, or cast the <type>money</type>
value to <type>numeric</type> before dividing and back to <type>money</type>
afterwards. (The latter is preferable to avoid risking precision loss.)
When a <type>money</type> value is divided by another <type>money</type>
value, the result is <type>double precision</type> (i.e., a pure number,
not money); the currency units cancel each other out in the division.
money
型の値を整数型の値で除算すると、小数部分を0に切り捨てるように実行されます。
四捨五入した結果を得るためには、小数部分を持つ値で割り算するか、割り算を行う前にmoney
型の値をnumeric
型にキャストし、あとでmoney
型に戻します。
(精度を落とすリスクを避けるため、後者の方が好ましいです。)
money
型の値を別のmoney
型の値で除算すると、結果はdouble precision
型(通貨ではなく純粋な数値)になります。
除算では通貨の単位は相殺されます。