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
相关产品推荐
相关产品推荐

