postgresql中的money数据类型
2020-04-11 14:56 abce 阅读(6803) 评论(0) 编辑 收藏 举报pg中money类型以固定的分数精度存储货币金额;如下表:
名称 | 存储大小 | 描述 | 范围 |
money | 8bytes | 货币金额 | -92233720368547758.08 to +92233720368547758.07 |
表中显示的范围假设有两位小数。
分数精度由数据库的lc_monetary设置决定。
1 2 3 4 5 6 7 | postgres=# show lc_monetary; lc_monetary ------------- en_US.UTF-8 (1 row) postgres=# |
输入可以采用多种格式,包括整数和浮点数值,以及典型的货币格式,如'$1,000.00'。输出结果通常是后一种形式,但取决于语言环境。
由于该数据类型的输出结果是位置敏感的,因此将货币数据加载到具有不同的lc_monetary设置的数据库中可能无法工作。为了避免出现问题,在将转储恢复到新数据库之前,请确保lc_monetary的值与转储的数据库中的值相同或相等。
numeric, int, 和bigint型数据类型的值可以转换为money类型。从real和double precision类型转换可以通过先转换为numeric类型来完成,例如:
1 2 3 4 5 6 7 | postgres=# SELECT '12.34' ::float8:: numeric ::money; money -------- $12.34 (1 row) postgres=# |
但是,不建议这样做。不应该使用浮点数来处理money类型,因为可能会出现舍入错误。
money类型可以转换为numeric,而不损失精度。转换成其他类型可能会失去精度,还必须分两个阶段完成:
1 2 3 4 5 6 7 | postgres=# SELECT '52093.89' ::money:: numeric ::float8; float8 ---------- 52093.89 (1 row) postgres=# |
money类型除以整数值时,小数部分截断为零。要得到四舍五入的结果,可以用浮点值除,或者在除之前将money值转换为numeric值,然后再转换回money值。(后者更可取,以避免丧失精度的风险。)当一个money值除以另一个money值时,结果是双倍精度(即,一个纯粹的数字,而不是money);货币单位在除法中相互抵消。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | postgres=# create table money_test(m money); CREATE TABLE postgres=# insert into money_test values (123.456); INSERT 0 1 postgres=# insert into money_test values (123.454); INSERT 0 1 postgres=# show lc_monetary; lc_monetary ------------- zh_CN.UTF-8 (1 row) postgres=# select * from money_test; m ---------- ¥123.46 ¥123.45 (2 rows ) postgres=# set lc_monetary= 'en_US.UTF-8' ; SET postgres=# select * from money_test; m --------- $123.46 $123.45 (2 rows ) postgres=# select sum (m) from money_test; sum --------- $246.91 (1 row) postgres=# |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2016-04-11 V$RECOVERY_PROGRESS