Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17 / 18

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