企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 8.2\. 货币类型 `money`类型存储带有固定小数精度的货币金额,可查阅 [Table 8-3](#calibre_link-2276)。小数精度由[lc_monetary](#calibre_link-1571) 的设置来决定。表格中显示的范围假设有两位小数。可以以任意格式输入,包括整型, 浮点型,或者典型的货币格式,如`'$1,000.00'`。 根据区域字符集,输出一般是最后一种形式。 **Table 8-3\. 货币类型** | 名字 | 存储容量 | 描述 | 范围 | | --- | --- | --- | --- | | money | 8 字节 | 货币金额 | -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`值除时, 结果是`double precision`(也就是,一个纯数字,而不是money); 在结果中货币单位相互取消。