货币类型 ============= ``money``\ 类型存储固定小数精度的货币数字,参阅\ `表 `__\ 。小数的精度由数据库的\ `lc_monetary `__\ 设置决定。表中展示的范围假设有两个小数位。可接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,如\ ``'$1,000.00'``\ 。 输出通常是最后一种形式,但和区域相关。 .. container:: table :name: DATATYPE-MONEY-TABLE **表 货币类型** .. container:: table-contents ========= ======== ====== ============================================ 名字 存储尺寸 描述 范围 ========= ======== ====== ============================================ ``money`` 8 bytes 货币额 -92233720368547758.08到+92233720368547758.07 ========= ======== ====== ============================================ 由于这种数据类型的输出是区域敏感的,因此将\ ``money``\ 数据装入到一个具有不同\ ``lc_monetary``\ 设置的数据库是不起作用的。为了避免这种问题,在恢复一个转储到一个新数据库中之前,应确保新数据库的\ ``lc_monetary``\ 设置和被转储数据库的相同或者具有等效值。 数据类型\ ``numeric``\ 、\ ``int``\ 和\ ``bigint``\ 的值可以被造型成\ ``money``\ 。从数据类型\ ``real``\ 和\ ``double precision``\ 的转换可以通过先造型成\ ``numeric``\ 来实现,例如: .. code:: programlisting SELECT '12.34'::float8::numeric::money; 但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有圆整错误。 一个\ ``money``\ 值可以在不损失精度的情况下被造型成\ ``numeric``\ 。转换到其他类型可能会丢失精度,并且必须采用两个阶段完成: .. code:: programlisting SELECT '52093.89'::money::numeric::float8; 一个\ ``money``\ 值被一个整数值除的除法结果会被截去分数部分。要得到圆整的结果,可以除以一个浮点值,或者在除法之前把\ ``money``\ 转换成\ ``numeric``\ 然后在除法之后转回\ ``money``\ (如果要避免精度丢失的风险则后者更好)。当一个\ ``money``\ 值被另一个\ ``money``\ 值除时,结果是\ ``double precision``\ (即一个纯数字,而不是金额),在除法中货币单位被约掉了。