money
类型随固定的小数精度存储货币金额;参见 数据表 8.3。数据库的 lc_monetary 设置决定小数精度。表中显示的范围假设有两位小数。接受多种格式的输入,包括整数和浮点数常量,以及典型的货币格式,例如 '$1,000.00'
。输出通常采用后者形式,但取决于区域设置。
数据表 8.3。货币类型
名称 | 存储大小 | 描述 | 范围 |
---|---|---|---|
money |
8 字节 | 货币金额 | -92233720368547758.08 到 +92233720368547758.07 |
由于此数据类型的输出因区域设置而异,因此将 money
数据加载到 lc_monetary
设置不同的数据库中可能无法正常工作。为避免出现问题,在将转储还原到新数据库之前,请确保 lc_monetary
的值与转储的数据库中的值相同或相等。
numeric
、int
和 bigint
数据类型的值可以强制转换为 money
。从 real
和 double precision
数据类型转换可以通过先强制转换为 numeric
来完成,例如
SELECT '12.34'::float8::numeric::money;
但是,不建议这样做。由于存在舍入误差的可能性,不应使用浮点数处理资金。
可以将 money
值强制转换为 numeric
,而不会造成精度损失。转换为其他类型可能会丢失精度,并且还必须分两步进行
SELECT '52093.89'::money::numeric::float8;
money
值除以整数值时,将对小数部分执行截断为零的操作。要获得舍入结果,请除以浮点值,或将 money
值强制转换为 numeric
,然后再除回来强制转换为 money
(后者较好,以避免精度损失风险)。当将 money
值除以另一个 money
值时,结果为 double precision
(即一个纯数字,不是货币);货币单位在除法中互相抵消。