JavaScript实现LeetCode Multiply Strings时大数运算精度丢失求助
解决Multiply Strings的精度问题
你的代码直接用num1*num2会触发JavaScript的隐式类型转换,把字符串转成Number类型。但JavaScript的Number是双精度浮点数,只能精确表示小于2^53的整数。而123456789 * 987654321的结果是121932631112635269,这个数远大于2^53(约9e15),所以转成Number时会丢失精度,最终导致结果错误。
LeetCode这道题的核心要求就是不能依赖内置的大整数处理或直接转数字相乘,必须模拟手工乘法的逻辑来处理超大数字。
下面是正确的实现代码:
var multiply = function(num1, num2) { // 处理其中一个数为0的特殊情况 if (num1 === "0" || num2 === "0") return "0"; const len1 = num1.length; const len2 = num2.length; // 结果数组,长度为两数长度之和,初始全为0 const result = new Array(len1 + len2).fill(0); // 从num1的末尾(个位)开始遍历每一位 for (let i = len1 - 1; i >= 0; i--) { const digit1 = parseInt(num1[i]); // 从num2的末尾(个位)开始遍历每一位 for (let j = len2 - 1; j >= 0; j--) { const digit2 = parseInt(num2[j]); // 当前位乘积加上该位置已有的值(包含之前的进位) const product = digit1 * digit2 + result[i + j + 1]; // 保留当前位的个位 result[i + j + 1] = product % 10; // 进位加到前一位 result[i + j] += Math.floor(product / 10); } } // 跳过数组开头的多余0 let start = 0; while (start < result.length && result[start] === 0) { start++; } // 转成字符串返回 return result.slice(start).join(''); }; console.log(multiply("123456789", "987654321")); // 输出正确结果"121932631112635269"
关键逻辑说明:
- 特殊情况处理:如果任一输入是"0",直接返回"0",避免无效计算。
- 结果数组初始化:两个长度为m和n的数字相乘,结果的最大长度是m+n,用数组存储每一位的计算结果,初始全为0。
- 逐位相乘模拟手工计算:从两个数字的个位开始,依次计算每一位的乘积,加上该位置已有的值(包含前一次计算的进位),再拆分出当前位和进位,分别存入数组对应位置。
- 去除前导0:计算完成后,数组开头可能存在多余的0,需要跳过这些0再转成字符串。
内容的提问来源于stack exchange,提问作者Varun Singh
相关产品推荐
相关产品推荐

