如何在PostgreSQL中创建最多存储3位小数的float类型列
PostgreSQL 限制score列小数位数为3位的实现方法
方案1:使用NUMERIC精确数值类型(最推荐)
FLOAT属于近似浮点类型,本身无法精确限制小数存储位数,对于分数这类对精度有要求的数值,优先使用NUMERIC(和DECIMAL完全等价)类型:
- 语法为
NUMERIC(总位数, 小数位数),第二个参数即为固定保留的小数位,你可以根据业务中分数的最大整数范围调整总位数,比如要支持最高999.999的分数,设置为NUMERIC(6,3)即可。
修改后的建表语句:
CREATE TABLE my_table( id INT GENERATED ALWAYS AS IDENTITY NOT NULL PRIMARY KEY, description TEXT, score NUMERIC(6,3) NOT NULL );
该方案下,PostgreSQL会自动对超出3位小数的输入做四舍五入,不会出现精度丢失问题。
方案2:保留FLOAT类型加CHECK约束
如果有特殊场景必须使用FLOAT类型,可以通过添加校验约束实现小数位数限制:
CREATE TABLE my_table( id INT GENERATED ALWAYS AS IDENTITY NOT NULL PRIMARY KEY, description TEXT, score FLOAT NOT NULL CHECK (ROUND(score::numeric, 3) = score::numeric) );
注意:
FLOAT的近似存储特性可能导致看似是3位小数的数值实际存储时存在极小的精度偏差,触发约束校验失败,非特殊需求不建议使用该方案。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

