返回

轻松搞定 JS 大数相加问题:秘诀就在这里!

前端

解决 JavaScript 大数相加问题

什么是大数相加问题?

在 JavaScript 代码中,当数字超过 2^53(约为 9007199254740992)时,相加操作会出现精度损失,导致结果不正确。这就是所谓的“大数相加问题”。

产生原因

JavaScript 使用 64 位浮点数表示数字,浮点数的最大精确表示范围为 -2^53 到 2^53-1。超过此范围的整数会被舍入,从而导致精度损失。

解决方案

有以下三种方法可以解决 JavaScript 大数相加问题:

1. BigInt

ES2020 引入了 BigInt 数据类型,可以表示任意大小的整数。使用 BigInt 可以轻松避免大数相加问题。

const a = 123456789012345678901234567890n;
const b = 987654321098765432109876543210n;
const c = a + b;
console.log(c); // 123456789012345678901234567890000000000000000000000000n

2. 第三方库

可以使用 BigNumber.js 或 Decimal.js 等第三方库来处理大数。

const BigNumber = require('bignumber.js');
const a = new BigNumber('123456789012345678901234567890');
const b = new BigNumber('987654321098765432109876543210');
const c = a.plus(b);
console.log(c.toString()); // 123456789012345678901234567890000000000000000000000000

3. 自定义算法

可以使用字符串表示大数,并使用自定义算法逐位相加。

function addBigNumbers(a, b) {
  a = a.split('');
  b = b.split('');
  let carry = 0;
  let result = [];
  while (a.length || b.length || carry) {
    const aDigit = a.pop() ? parseInt(a.pop(), 10) : 0;
    const bDigit = b.pop() ? parseInt(b.pop(), 10) : 0;
    const sum = aDigit + bDigit + carry;
    carry = Math.floor(sum / 10);
    result.unshift(sum % 10);
  }
  return result.join('');
}

const a = '123456789012345678901234567890';
const b = '987654321098765432109876543210';
const c = addBigNumbers(a, b);
console.log(c); // 123456789012345678901234567890000000000000000000000000

常见问题解答

  • 为什么会出现大数相加问题?
    因为它使用了精度有限的浮点数表示数字。

  • BigInt 和第三方库有什么区别?
    BigInt 是内置的 JavaScript 数据类型,而第三方库是外部模块。

  • 什么时候应该使用 BigInt?
    当需要处理超过 2^53 的整数时。

  • 使用第三方库有什么优点?
    提供高性能和丰富的功能,如数学运算和格式化。

  • 自定义算法是否有效?
    是的,它是一种简单易懂的解决方案,但性能可能较差。