8.2. Monetary Types
The
money
type stores a currency amount with a fixed
fractional precision; see
Table 8.3
. The fractional precision is
determined by the database's
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
'$1,000.00'
.
Output is generally in the latter form but depends on the locale.
Table 8.3. Monetary Types
Name | Storage Size | Description | Range |
---|---|---|---|
money
|
8 bytes | currency amount | -92233720368547758.08 to +92233720368547758.07 |
Since the output of this data type is locale-sensitive, it might not
work to load
money
data into a database that has a different
setting of
lc_monetary
. To avoid problems, before
restoring a dump into a new database make sure
lc_monetary
has
the same or equivalent value as in the database that was dumped.
Values of the
numeric
,
int
, and
bigint
data types can be cast to
money
.
Conversion from the
real
and
double precision
data types can be done by casting to
numeric
first, for
example:
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
money
value can be cast to
numeric
without
loss of precision. Conversion to other types could potentially lose
precision, and must also be done in two stages:
SELECT '52093.89'::money::numeric::float8;
Division of a
money
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
money
value to
numeric
before dividing and back to
money
afterwards. (The latter is preferable to avoid risking precision loss.)
When a
money
value is divided by another
money
value, the result is
double precision
(i.e., a pure number,
not money); the currency units cancel each other out in the division.