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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:22:47