JS实现Luhn算法时parseInt转换元素返回NaN问题咨询
问题根源
你代码里parseInt()返回NaN由多个逻辑错误共同导致:
- 最直接的原因是数组索引越界:单个数字乘2的结果范围是0~18,当结果大于等于10时必然是两位数,转字符串拆分后得到的数组长度固定为2,合法索引只有
0(对应十位数字)和1(对应个位数字)。你代码中写的是取aftermutliStringed[2],访问的是数组中不存在的第三个元素,返回值为undefined,对undefined执行parseInt()转换自然得到NaN。 - 数位求和逻辑本身错误:即使修正索引问题,你当前写的
first + first是把同一个数字相加,并非取两个数位求和,例如结果为12时会计算成2+2=4,和预期的1+2=3完全不符。 - 分支判断条件有遗漏:触发数位相加的判断条件写为
multi > 10,漏掉了multi === 10的场景,10需要计算1+0=1,不进入处理分支会直接用10参与后续计算,最终结果错误。
修正参考
针对原有逻辑修正后的代码如下:
var num = 122345643345673; var convNum = num.toString(); var aftertoString = convNum.split(""); for(let i = 1; i < aftertoString.length; i++){ if (i % 2 == 0) { // 显式转数字避免隐式转换带来的不可预期问题 var multi = Number(aftertoString[i]) * 2; if(multi >= 10){ // 字符串拆分法:取索引0、1的两个数位相加 const multiStr = multi.toString(); const numArr = multiStr.split(""); multi = parseInt(numArr[0]) + parseInt(numArr[1]); // 更简便的数学计算法:两位数乘2结果的数位和 = 结果本身减9,无需转字符串 // multi = multi - 9; } console.log(multi); } }
补充提示:标准Luhn算法是从数字最右侧(校验位)开始从右往左隔位乘2,你当前从左往右按索引偶数位乘2的顺序和标准逻辑有出入,如果最终校验结果不对可以优先检查遍历顺序。
内容的提问来源于stack exchange,提问作者Samuel Emeka
相关产品推荐
相关产品推荐

