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

SQL整数除法与浮点数除法区别及BMI计算结果异常原因

SQL整数除法导致BMI计算偏差问题解答

题目要求

从patients表中查询patient_id、weight、height、isObese四个字段,其中isObese以0或1的布尔值展示:

  • 肥胖判定规则:体重(kg) / (身高(m))² ≥ 30
  • 表中weight、height字段均为无小数的int类型,身高原始存储单位为cm,计算前需要转换为m单位。

初始错误实现代码

SELECT patient_id, weight, height,
CASE
WHEN weight/POWER(height/100,2) >= 30 then '1'
ELSE '0' END AS isObese
FROM patients

核心原因:整数除法与浮点数除法的差异

问题本质是SQL不同数据类型的运算规则差异:

  • 当运算符两边的操作数都是整数类型时,SQL默认执行整数除法,运算结果会直接截断小数部分,仅保留整数位,不会保留精确的小数值。
  • 初始写法里的height/100中,height是int类型,常量100也是整数类型,因此会触发整数除法:比如身高为168cm时,168/100的计算结果是1,而非实际需要的1.68,后续计算平方、BMI的结果会完全偏离真实值。
  • 正确写法中的height/100.0,常量100.0是浮点数类型,SQL在运算时会自动把整数类型的height隐式转换为浮点数再做除法,得到精确的小数值:比如168/100.0=1.68,后续的平方、BMI计算结果才符合公式要求。

计算示例对比

以身高170cm、体重80kg的记录为例:

  • 错误写法计算链路:170/100=1(整数截断)→ POWER(1,2)=1 → BMI=80/1=80 → 错误判定为肥胖,实际BMI为80/(1.7²)≈27.68,并未达到肥胖标准。
  • 正确写法计算链路:170/100.0=1.7(浮点精确计算)→ POWER(1.7,2)=2.89 → BMI≈27.68 → 判定结果正确。

额外优化提示

初始代码中THEN '1'和ELSE '0'返回的是字符串类型的0和1,如果需要返回数值类型的布尔标识,可以去掉单引号,直接写THEN 1 ELSE 0即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:01:04