↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

8.2. 货币类型 #

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

表 8.3. 货币类型

名字存储尺寸描述范围
money8 字节货币额-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 文档反馈表单.