LeetCode SQL《游戏玩法分析IV》代码除法结果异常原因咨询
问题根源与修复原理解析
原代码返回0的问题根源
PostgreSQL 中,当两个整数类型的值执行除法时,会触发整数除法规则——只保留商的整数部分,直接舍去小数部分。
你的代码里,count(player_id) 和子查询中的 count(distinct player_id) 返回的都是 bigint(整数类型)。假设符合条件的玩家数是 N,总玩家数是 M,且 N < M,那么 N/M 会被直接计算为整数 0,后续的 round(0, 2) 自然也只会返回 0。
::numeric 修复问题的原因
::numeric 是 PostgreSQL 里的类型转换语法,它把整数类型的计数结果转换成了 高精度数值类型(numeric/decimal)。
当两个 numeric 类型的值进行除法运算时,PostgreSQL 会执行精确小数除法,保留完整的小数部分。比如 3/10 会得到 0.3 而非 0,再经过 round(..., 2) 处理后就能得到正确的两位小数结果。
举个实际对比例子:
- 整数除法:
3::bigint / 10::bigint = 0 - 数值除法:
3::numeric / 10::numeric = 0.3
内容的提问来源于stack exchange,提问作者qanqanqan
相关产品推荐
相关产品推荐

