バージョンごとのドキュメント一覧

8.2. 通貨型 #

<title>Monetary Types</title>

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 通貨型

<title>Monetary Types</title>
型名格納サイズ説明範囲
money8バイト貨幣金額-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: numericintそして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型(通貨ではなく純粋な数値)になります。 除算では通貨の単位は相殺されます。