PHP BMI计算器提示错误:BMI=18.5时误判为体重过轻求助
BMI计算器条件判断异常问题排查
问题描述
我用PHP开发BMI计算器时遇到问题:当计算出的BMI值接近18.5时,本该显示“Normal weight(正常体重)”,却提示“Underweight(体重过轻)”。测试输入参数为:英尺6、英寸5、磅156,尝试调整条件判断一小时仍未解决。
代码示例
$feet = $_GET['feet']; $inches = $_GET['inches']; $weight = $_GET['pounds']; $height = (float) $feet * 12 + (float) $inches; $bmi = ($weight/($height * $height)) * 703; if ($bmi < 18.5) $result = "Underweight"; else if ($bmi >= 18.5 && $bmi <= 24.9) $result = "Normal weight"; else if ($bmi > 24.9 && $bmi <= 29.9) $result = "Overweight"; else $result = "Obese"; printf("Your Height: %u' %u\"<br>Your Weight: %u lb<br>Your BMI is %.1f you are %s",$feet,$inches,$weight,$bmi,$result);
问题原因
先手动计算你的测试参数对应的BMI值:
- 身高:6英尺5英寸 = 6×12+5 = 77英寸
- BMI公式:
(体重磅数 / (身高英寸数²)) × 703 - 代入数值:
(156/(77×77))×703 ≈ 18.496
因为PHP浮点数运算存在精度误差,实际计算得到的$bmi值是略小于18.5的(比如18.4959...),但你用printf输出时保留了1位小数,显示为18.5,导致你误以为BMI等于18.5,实际却触发了$bmi < 18.5的条件分支。
解决方案
可以通过以下两种方式解决:
1. 对BMI值进行四舍五入后再判断
在计算出$bmi后,将其四舍五入到1位小数(和你输出的精度一致),再进行条件判断:
$bmi = ($weight/($height * $height)) * 703; // 新增:四舍五入到1位小数 $bmi = round($bmi, 1);
这样18.496会被处理为18.5,就能正常进入“Normal weight”分支。
2. 调整条件边界的精度处理
如果不想修改BMI的原始值,可以调整条件判断的边界,允许微小的精度误差,比如:
if ($bmi < 18.5 - 0.001) $result = "Underweight"; else if ($bmi >= 18.5 - 0.001 && $bmi <= 24.9) $result = "Normal weight";
这种方式可以兼容浮点数运算的微小误差,避免接近边界值的数值被误判。
内容的提问来源于stack exchange,提问作者Epik Produkmins
相关产品推荐
相关产品推荐

