calculateLevel函数异常:XP=54592352时等级跳至1000问题
问题原因与修复方案
问题根源
当level达到106时,升级公式里的乘数1.00 - (0.0095 * level)会变为负数:1 - 0.0095*106 = 1 - 1.007 = -0.007
此时next += parseInt(next * 0.235 * 负数)会导致next的值减小,当输入的xp等于level106所需的next值(54592352)时,进入循环后next会被减小到小于xp的数值,循环条件next <= xp && level < 1000会一直满足,循环会持续执行直到level达到1000的上限,最终出现跳级到1000的问题。
修复方案
需要避免升级增量变为负数,以下是两种可行的修复方式:
方式1:当乘数为负时停止升级
修改循环逻辑,判断乘数是否为正,若为负则退出循环,认为已达最高可升级等级:
const calculateLevel = (xp) => { let next = 500; let level = 0; while (next <= xp && level < 1000) { const multiplier = 1.00 - (0.0095 * level); if (multiplier <= 0) break; next += parseInt(next * 0.235 * multiplier); level++; } return {level, next}; };
方式2:强制增量不小于0
如果希望等级可以继续提升,但升级所需xp不再减少,将增量取最大值0:
const calculateLevel = (xp) => { let next = 500; let level = 0; for (let i = 1; next <= xp && level < 1000; i++) { const increment = parseInt(next * 0.235 * (1.00 - (0.0095 * level))); next += Math.max(increment, 0); level++; } return {level, next}; };
测试修复后的代码:
console.log(calculateLevel(54592351)); // { level: 106, next: 54592352 } console.log(calculateLevel(54592352)); // 方式1返回{ level: 106, next: 54592352 };方式2会继续提升等级,但next不再减少
内容的提问来源于stack exchange,提问作者n1colas
相关产品推荐
相关产品推荐

