PostgreSQL中对Float字段使用AVG函数后能否最多保留3位小数?
PostgreSQL限制AVG计算结果小数位数的实现方案
有两种常用方案可以实现“小数位数最多3位,可少于3位”的需求,你可以根据使用场景选择:
方案1:保留数值类型,适合后续需要做数值计算的场景
直接用ROUND函数对AVG的计算结果做四舍五入,需要先把浮点类型的结果转为numeric避免浮点精度误差:
SELECT team, ROUND(AVG(score)::numeric, 3) AS avg_score FROM team_score_table GROUP BY team;
- 如果不需要四舍五入,要直接舍弃第3位之后的小数,把
ROUND替换成TRUNC即可,用法完全一致。 - 该方案返回的结果是数值类型,默认会保留末尾的0(例如计算结果为85.1时会显示为85.100),如果需要省略末尾的0可以用方案2。
方案2:自定义格式化输出,适合直接展示的场景
用TO_CHAR函数自定义格式化规则,自动省略小数末尾多余的0:
SELECT team, TO_CHAR(AVG(score), 'FM999999999.999') AS avg_score FROM team_score_table GROUP BY team;
- 格式符说明:
FM前缀会移除结果末尾多余的0和多余的小数点,小数点后写3个9代表最多保留3位小数,不足3位的部分不会补0,完全符合你的要求。 - 注意该方案返回的结果是字符串类型,不适合后续做数值运算。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

