跳到主要内容

大数相加

在 JavaScript 中,当处理超过安全整数范围的大数字时,内置的Number类型可能无法提供足够的精度。这时,我们需要一种方法来实现大数的相加操作。本文将介绍一种基于字符串处理的解决方案,并通过代码示例进行说明。

实现方法

以下是一个实现大数相加的函数:

function bigNumberAddition(firstNumber, secondNumber) {
let carryOver = 0; // 初始化进位
let sumArray = [];

// 使两个数字字符串长度相同
const maxLength = Math.max(firstNumber.length, secondNumber.length);
firstNumber = firstNumber.padStart(maxLength, '0');
secondNumber = secondNumber.padStart(maxLength, '0');

// 从低位到高位进行相加
for (let i = maxLength - 1; i >= 0; i--) {
let digitSum = parseInt(firstNumber[i], 10) + parseInt(secondNumber[i], 10) + carryOver;
sumArray.unshift(digitSum % 10); // 当前位的结果
carryOver = Math.floor(digitSum / 10); // 更新进位
}

// 如果最后仍有进位,添加到结果前面
if (carryOver) {
sumArray.unshift(carryOver);
}

return sumArray.join('');
}

// 测试
const numA = '12345678901234567890';
const numB = '98765432109876543210';
const sum = bigNumberAddition(numA, numB);
console.log(sum); // 输出 111111111011111111100

代码详解

初始化进位和结果数组

let carryOver = 0; // 初始化进位
let sumArray = [];
  • carryOver 用于存储每一位相加后的进位值。
  • sumArray 用于存储每一位相加的结果。

确保两个数字字符串长度相同

const maxLength = Math.max(firstNumber.length, secondNumber.length);
firstNumber = firstNumber.padStart(maxLength, '0');
secondNumber = secondNumber.padStart(maxLength, '0');
  • 通过Math.max找到两个数字字符串中较长的长度。
  • 使用padStart方法在较短的字符串前补充'0',使两个字符串长度相同,便于逐位相加。

从低位到高位进行相加

for (let i = maxLength - 1; i >= 0; i--) {
let digitSum = parseInt(firstNumber[i], 10) + parseInt(secondNumber[i], 10) + carryOver;
sumArray.unshift(digitSum % 10); // 当前位的结果
carryOver = Math.floor(digitSum / 10); // 更新进位
}
  • 使用for循环从字符串的最后一位(低位)开始,逐位相加。
  • parseInt将字符转换为整数进行相加。
  • digitSum % 10得到当前位的结果,并将其添加到sumArray的前面。
  • Math.floor(digitSum / 10)计算进位值,供下一位使用。

处理最后的进位

if (carryOver) {
sumArray.unshift(carryOver);
}
  • 如果最后仍有进位,将其添加到结果数组的最前面。

返回结果

return sumArray.join('');
  • 使用join方法将结果数组转换为字符串形式的大数相加结果。

测试示例

const numA = '12345678901234567890';
const numB = '98765432109876543210';
const sum = bigNumberAddition(numA, numB);
console.log(sum); // 输出 111111111011111111100
  • 此测试示例展示了两个长度相同的大数相加的结果。
  • 输出结果为111111111011111111100,验证了函数的正确性。

最佳实践

  • 输入验证:在实际应用中,应对输入进行验证,确保输入的字符串仅包含数字字符。

    function isValidNumber(str) {
    return /^\d+$/.test(str);
    }

    if (!isValidNumber(firstNumber) || !isValidNumber(secondNumber)) {
    throw new Error('输入必须为数字字符串');
    }
  • 处理负数:当前函数仅支持正数相加。要支持负数,需要扩展函数逻辑,处理符号位。

  • 性能优化:对于非常长的数字,可以考虑使用更高效的数据结构或算法来优化性能。