You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:35:20