使用Math方法无法正确返回输入数值最高、最低值的JavaScript代码异常问题
商品价格录入统计最高/最低值计算异常排查
当前实现下最高、最低值输出不符合预期,核心是几个常见逻辑疏漏导致的:
- 统计变量初始化错误
多数实现会把最高值、最低值默认初始化为0,存在两个明显隐患:一是用户未录入任何有效价格、直接输入-1终止流程时,最终弹窗会错误输出0作为最高/最低值;二是如果录入价格低于初始设定值,会直接污染极值计算结果。
正确的初始化方式是将最高值设为-Infinity、最低值设为Infinity,保证第一次录入的有效价格一定会覆盖初始值,完成极值的首次赋值。 - 输入值未做类型转换
prompt弹窗返回内容默认是字符串类型,不通过Number()做强制数值转换,直接参与数值比较、累加、Math.max/Math.min运算时,会触发隐式类型转换异常:比如字符串形式的"20"和"9"按字典序比较时,会判定"9"大于"20",直接导致极值计算结果完全错误。 - 终止值判断时机错误
拿到价格输入后没有第一时间判断是否等于终止值-1,就直接把输入值纳入累加、计数、极值计算流程,会导致-1被当成有效价格参与统计,最终输出的最低值永远是-1,完全偏离统计预期。 - Math方法调用逻辑错误
循环内如果没有每次将当前录入价格和已存储的max/min值做对比更新,而是无意义地反复调用Math.max()传空参数,会导致最高、最低值始终停留在初始值,无法跟随录入价格动态更新。
可正常运行的参考实现
// 初始化统计变量 let currentPrice; let totalGoodsCount = 0; let totalCost = 0; let maxPrice = -Infinity; let minPrice = Infinity; let avgPrice; // 首次获取录入输入 currentPrice = Number(prompt("请输入商品价格,输入-1终止录入:")); while (currentPrice !== -1) { // 拦截无效输入(非数字、非正价格) if (isNaN(currentPrice) || currentPrice <= 0) { currentPrice = Number(prompt("输入无效,请输入正的商品价格,输入-1终止:")); continue; } // 完成统计计算 totalGoodsCount += 1; totalCost += currentPrice; // 动态更新极值 maxPrice = Math.max(maxPrice, currentPrice); minPrice = Math.min(minPrice, currentPrice); // 获取下一条录入 currentPrice = Number(prompt("请继续输入商品价格,输入-1终止录入:")); } // 处理边界场景、输出统计结果 if (totalGoodsCount === 0) { alert("未录入任何有效商品价格,无法生成统计结果"); } else { avgPrice = totalCost / totalGoodsCount; alert( `已购商品总数量:${totalGoodsCount}件\n` + `累计消费总金额:${totalCost.toFixed(2)}元\n` + `商品平均单价:${avgPrice.toFixed(2)}元\n` + `录入价格最高值:${maxPrice.toFixed(2)}元\n` + `录入价格最低值:${minPrice.toFixed(2)}元` ); }
内容的提问来源于stack exchange,提问作者seascholars
相关产品推荐
相关产品推荐

