You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中存储价格列的最优实践是什么?

电商系统商品价格存储类型选型解答

你当前使用NUMERIC类型存储商品价格是完全符合最优实践的选择,不需要替换为双精度浮点类型

为什么不推荐使用双精度浮点(DOUBLE)存储价格

双精度浮点类型是基于二进制实现的近似数值存储,无法精确表示所有十进制小数,最典型的例子就是0.1 + 0.2 = 0.30000000000000004的精度误差问题。
在电商场景下,价格计算涉及优惠叠加、税费计算、多商品金额累加、退款拆分等大量运算,浮点的微小误差会随着计算次数叠加,最终导致实际收款/退款金额和理论值出现偏差,直接产生资损风险。

NUMERIC(也叫DECIMAL)类型的适配性

NUMERIC是定点数类型,会按照你指定的精度和小数位数精确存储十进制数值,不会出现任何精度误差:

  • 普通商品价格场景使用NUMERIC(10,2)即可满足需求,最多可存储99999999.99的金额,完全覆盖绝大多数电商的商品定价范围
  • 如果涉及跨境多币种、或者需要计算到厘、毫等更小单位的场景,可以调整小数位为3或4,例如NUMERIC(12,4)
  • 所有数据库都对NUMERIC的运算做了兼容,加法、乘法、比较等操作都可以保证结果完全精确,开发时不需要额外做精度兼容,维护成本极低

其他可选的价格存储方案

除了NUMERIC之外,还有一种行业常用的方案是使用整数存储最小货币单位:

  • 例如人民币场景直接存储以分为单位的整数,1元就存为100,美元就存储以美分为单位的整数
  • 优势是整数运算性能远高于定点数,适合超大规模高并发的交易系统
  • 注意事项是必须统一全链路的单位规则,字段命名要明确标注单位(例如命名为price_cent),避免出现不同链路单位不统一的计算错误

实践建议

  • 普通规模电商直接选择NUMERIC类型即可,开发成本最低,无精度风险
  • 无论选择哪种存储方案,都绝对不要使用FLOAT、DOUBLE等浮点类型存储任何和金额相关的字段

内容的提问来源于stack exchange,提问作者Samuel Belo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 09:36:10