9.3 9.4 9.5 9.6 10 11 12 13 14 15 16 17 Current(18)
PostgreSQL中文社区 问题报告 纠错本页面

8.2. 货币类型 #

money类型存储固定小数精度的货币金额;请参见表 8.3。小数精度由数据库的lc_monetary设置决定。 表中显示的范围假设有两个小数位。输入格式多种多样,包括整数和 浮点文字,以及典型的货币格式,如'$1,000.00'。 输出通常为后者形式,但取决于区域设置。

表 8.3. 货币类型

名字存储大小描述范围
money8 bytes货币金额-92233720368547758.08到+92233720368547758.07

由于这种数据类型的输出是区域敏感的,因此将money数据装入到一个具有不同lc_monetary设置的数据库是行不通的。为了避免问题,在将转储恢复到新数据库之前,请确保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(即一个纯数字,而不是货币);在除法中,货币单位会相互抵消。