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

JavaScript Plus One问题:大整数数组加一代码失效原因咨询

问题分析与解决

为什么你的代码失效?

你这段代码的核心问题出在JavaScript的Number类型精度限制上:

  • 当你把长数字数组转成字符串再用Number()转换时,一旦数字长度超过16位左右(准确说是超过2^53-1,即9007199254740991),JavaScript就无法精确存储这个整数了,会自动转成科学计数法表示(比如类似1.2356777777777778e+21)。
  • 之后你把这个科学计数法的字符串拆分成数组时,里面的.、e、+这些非数字字符被Number()转换后就变成了NaN,这就是你看到输出里有NaN的原因。
  • 同时因为精度丢失,数字本身的值也已经不对了,所以最终结果完全偏离预期。

正确的实现方式

应该直接操作数字数组,从末尾开始处理进位,避免把整个数组转成超大数字:

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
    // 从最后一位开始遍历
    for (let i = digits.length - 1; i >= 0; i--) {
        // 当前位加1
        digits[i]++;
        // 如果加1后不等于10,说明没有进位,直接返回
        if (digits[i] !== 10) {
            return digits;
        }
        // 否则当前位设为0,继续处理前一位的进位
        digits[i] = 0;
    }
    // 如果遍历完所有位还有进位(比如原数组是[9,9,9]),就在最前面加1
    digits.unshift(1);
    return digits;
};

console.log(plusOne([1,2,3,5,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]));

验证结果

运行上面的代码,传入你测试的数组,会得到预期的[1,2,3,5,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8],完全符合要求。

内容的提问来源于stack exchange,提问作者derrick devairakkam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:50:28