受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

8.2. 货币类型 #

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

Table 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(即一个纯数字,而不是金额), 因为在除法中货币单位被约掉了。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。