SQL中32.99这类小数价格字段应选用什么数据类型?
PostgreSQL 商品价格字段类型选择方案
存储货币/价格类字段核心原则是绝对不要使用二进制浮点类型,避免精度丢失导致的计算错误,针对你的场景直接使用定点小数类型即可。
类型选择说明
- 排除
real、double precision这类浮点类型:这类类型用二进制存储十进制小数,会存在固有精度误差,比如存储32.99时实际落盘值可能为32.989999999999995,后续做汇总、折扣计算时会出现几分钱的偏差,是商品表建表的常见踩坑点。 - 不推荐使用
money类型:该类型的输出格式强依赖数据库的区域配置(lc_monetary参数),跨环境部署、导入CSV数据时容易出现格式不兼容问题,不适合课程作业场景。 - 最优选择是
NUMERIC(precision, scale)定点小数类型:该类型可以精准存储指定精度的十进制数值,完全没有浮点误差,是价格类字段的标准选型。
适配你业务场景的参数配置
你的所有价格都是两位小数、以.99结尾,直接定义为NUMERIC(10,2)即可:
类型参数中,第一个值代表总有效数字位数,第二个值代表固定小数位数。
NUMERIC(10,2)支持存储的最大值为99999999.99(接近1亿元),完全覆盖普通零售商品的价格区间,固定两位小数的设置刚好适配你的定价格式,不会出现精度损失。
如果后续需要存储单价极高的特殊商品,只需要调大总有效数字位数即可,比如NUMERIC(12,2)即可支持最高百亿级的价格存储,小数位保持2位不变即可适配人民币、美元等通用货币的计量需求。
修改后的建表片段
( product_id bigserial, product_name text, brand_id bigserial, category_id bigserial, model_year bigserial, list_price NUMERIC(10,2) NOT NULL );
导入注意事项
用pgAdmin4导入CSV时不需要做额外的类型转换,NUMERIC(10,2)可以直接识别文件中239.99、32.99这类格式的价格数值,正常走导入流程即可。
内容的提问来源于stack exchange,提问作者MFC 4
相关产品推荐
相关产品推荐

