为何仅调用Math方法的JS异步函数lvl传入数字却返回NaN?
问题分析:传入数字参数的异步函数返回NaN的原因
核心原因:平方根函数传入负数导致NaN
当你传入total=25到lvl函数时,判别式的计算结果为负数,而Math.sqrt()无法处理负数参数,直接返回NaN,后续所有依赖该值的计算都会变成NaN。
具体计算过程拆解
代入xp=25到判别式表达式:
10 * 10 - 4 * 10 * (-(xp - 40))
分步计算:
- 计算括号内:
25 - 40 = -15 - 取负操作:
-(-15) = 15 - 乘法运算:
4 * 10 * 15 = 600 - 最终判别式:
100 - 600 = -500
由于Math.sqrt(-500)返回NaN,后续n1、n2的计算都会继承这个NaN,最终得到的n自然也是NaN。
修复方案
- 先校验判别式合法性:在计算平方根前判断判别式是否非负,避免传入负数:
async function lvl(xp) { const discriminantCalc = 10 * 10 - 4 * 10 * (-(xp - 40)); // 处理判别式为负的情况 if (discriminantCalc < 0) { console.log('当前XP值不符合等级计算公式要求'); return 0; // 或返回其他合理默认值 } let discriminant = Math.sqrt(discriminantCalc); let n1 = (-10 + discriminant) / (2 * 10); let n2 = (-10 - discriminant) / (2 * 10); let n = n1 >= 0 ? Math.floor(n1) : Math.floor(n2); console.log('n', n, typeof n); return n; }
- 检查等级公式正确性:当前公式在
xp<40时都会得到负的判别式,这可能和你预期的等级规则不匹配。请重新推导等级对应的数学公式,确保其在合法的XP范围内能得到非负的判别式。
内容的提问来源于stack exchange,提问作者leguchi
相关产品推荐
相关产品推荐

