swapDigits函数中乘-1无法返回负数的问题排查
问题:swapDigits函数无法正确生成负数结果
在以下swapDigits函数中,这段代码仅在特定场景下能将数字转为负数,无法覆盖所有输入负数的情况:
swappedNumber = Number(numberStringArray.join("")) * -1;
单独在控制台测试正数乘-1能得到正确负数,但调用swapDigits(-564783)时,返回的是657438而非预期的-657438。完整代码如下:
// swapDigits const swapDigits = (number) => { let swappedNumber = 0; if (number < 0) { number = Math.abs(number); const numberString = number.toString(); console.log(numberString); const numberStringArray = []; if (numberString.length % 2 == 0) { for (let i = 0; i < numberString.length; i = i + 2) { numberStringArray.push(numberString[i + 1]); numberStringArray.push(numberString[i]); } swappedNumber = Number(numberStringArray.join("")); } else { numberStringArray.push(numberString[0]); for (let i = 1; i < numberString.length; i = i + 2) { numberStringArray.push(numberString[i + 1]); numberStringArray.push(numberString[i]); } swappedNumber = Number(numberStringArray.join("")) * -1; } } else { const numberString = number.toString(); console.log(numberString); const numberStringArray = []; if (numberString.length % 2 == 0) { for (let i = 0; i < numberString.length; i = i + 2) { numberStringArray.push(numberString[i + 1]); numberStringArray.push(numberString[i]); } swappedNumber = Number(numberStringArray.join("")); } else { numberStringArray.push(numberString[0]); for (let i = 1; i < numberString.length; i = i + 2) { numberStringArray.push(numberString[i + 1]); numberStringArray.push(numberString[i]); } swappedNumber = Number(numberStringArray.join("")); } } return swappedNumber; }; const even = swapDigits(-564783); console.log(even); // logs 657438 instead of -657438 const odd = swapDigits(512364783); console.log(odd);
问题原因
你仅在输入负数且数字长度为奇数的分支里给结果乘了-1,但输入负数且数字长度为偶数时,直接将转换后的正数赋值给了swappedNumber,未添加负号。比如-564783的长度是6(偶数),走的是even分支,结果自然没有负号。
解决方案
最简单的修复方式是把正负判断和数字转换逻辑分离,统一处理负号,避免分支遗漏。修改后的代码如下:
const swapDigits = (number) => { let swappedNumber = 0; // 标记输入是否为负数 const isNegative = number < 0; // 统一处理数字的绝对值 number = Math.abs(number); const numberString = number.toString(); console.log(numberString); const numberStringArray = []; if (numberString.length % 2 == 0) { for (let i = 0; i < numberString.length; i = i + 2) { numberStringArray.push(numberString[i + 1]); numberStringArray.push(numberString[i]); } swappedNumber = Number(numberStringArray.join("")); } else { numberStringArray.push(numberString[0]); for (let i = 1; i < numberString.length; i = i + 2) { numberStringArray.push(numberString[i + 1]); numberStringArray.push(numberString[i]); } swappedNumber = Number(numberStringArray.join("")); } // 根据标记决定是否添加负号 return isNegative ? swappedNumber * -1 : swappedNumber; }; const even = swapDigits(-564783); console.log(even); // 现在输出 -657438 const odd = swapDigits(512364783); console.log(odd);
这种写法还能减少代码重复,让逻辑更清晰。
内容的提问来源于stack exchange,提问作者larry8989
相关产品推荐
相关产品推荐

