8.2. 货币类型 #
money 类型以固定的小数精度存储货币金额;参见表 8.3。小数精度由数据库的 lc_monetary 设置决定。表中显示的范围假定有两位小数。输入支持多种格式,包括整数字面量和浮点数字面量,以及典型的货币格式,例如 '$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。转换到其他类型可能会丢失精度,并且必须采用两个阶段完成:
SELECT '52093.89'::money::numeric::float8;
一个 money 值除以一个整数值时,会朝零方向截去小数部分。要得到舍入后的结果,可以除以一个浮点值,或者在除法前先把
money 转换为 numeric,再在除法后转换回
money(如果要避免精度丢失风险,后一种做法更好)。当一个 money 值被另一个 money 值除时,结果是 double precision(即一个纯数字,而不是金额),因为在除法中货币单位被约掉了。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.