选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.4 已于 2020 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

8.2. 货币类型 #

money 类型以固定的小数精度存储货币金额; 参见 表 8.3。小数精度由数据库的 lc_monetary 设置决定。表中显示的范围假定 有两位小数。输入支持多种格式,包括整数字面量和浮点数字面量,以及典型的 货币格式,例如 '$1,000.00'。输出通常也采用 后一种形式,但会受到区域设置影响。

表 8.3. 货币类型

名字 存储尺寸 描述 范围
money 8 字节 货币额 -92233720368547758.08 到 +92233720368547758.07

由于该数据类型的输出依赖区域设置,因此在 lc_monetary 设置不同的数据库之间装入 money 数据时,可能无法正常工作。为了避免这类问题, 在将转储恢复到新数据库之前,应确保新数据库的 lc_monetary 设置与原数据库相同或等效。

数据类型numericintbigint的值可以转换为money。从数据类型realdouble precision的转换可以通过先转换为numeric来实现,例如:

SELECT '12.34'::float8::numeric::money;

但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有舍入误差。

一个money值可以在不损失精度的情况下转换为numeric。转换到其他类型可能会丢失精度,并且必须采用两个阶段完成:

SELECT '52093.89'::money::numeric::float8;

一个 money 值除以一个整数值时,会朝零方向截去小数 部分。要得到舍入后的结果,可以除以一个浮点值,或者在除法前先把 money 转换为 numeric,再在除法后转换回 money(如果要避免精度丢失风险,后一种做法更好)。 当一个 money 值被另一个 money 值除时, 结果是 double precision(即一个纯数字,而不是金额), 因为在除法中货币单位被约掉了。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。