问题:JavaScript实现一个add方法,完成两个大数相加?

问题:JavaScript实现一个add方法,完成两个大数相加?

  • 1.前言
  • 2.使用BigInt
  • 3.字符串相加法
    • 3.1 思路
    • 3.2 代码实现
  • 4.使用第三方库(如big.js或bignumber.js)

1.前言

在JavaScript中,直接使用基本的数据类型(如Number)进行大数相加时,由于JavaScript的Number类型是基于IEEE754标准的双精度64位浮点格式,其最大安全整数是2^53 - 1(大约是9007199254740991),超过这个值会导致精度丢失。对于大数的加法,我们可以使用以下几种方法:

2.使用BigInt

从ES2020开始,JavaScript引入了BigInt类型,它允许你安全地存储和操作任意大小的整数。使用BigInt,你可以轻松地进行大数相加。

function addBigNumbers(a,b){
    let newA=BigInt(a);
    let newB=BigInt(b);
    return newA+newB;
}
console.log(addBigNumbers("12345678901234567890", "98765432109876543210"));//111111111011111111100n(正确)
console.log(12345678901234567890+98765432109876543210);//111111111011111110000(不正确)

3.字符串相加法

如果出于某些原因无法使用BigInt(例如兼容性要求),可以通过字符串操作来实现大数的加法。这种方法虽然效率较低,但可以避免依赖现代JavaScript特性。

3.1 思路

思路:判断两个字符串长度,通过补 0 的方式,让他们长度相同,由于我们在学生时代,这种加减法都是从右往左,所以,我们对数组进行反转,这样就可以让计算机按照我们的想法去实现,做的过程中,一定要考虑满 10 进 1 的情况,全部算完后,再反转回来,通过 join 合并成字符串进行返回。

3.2 代码实现

function addBigNumbersAsString(a,b){
    let result=""
    let carry = 0;
    a=a.split("").reverse();
    b=b.split("").reverse();
    let maxLength=Math.max(a.length,b.length);
    for(let i=0;i<maxLength;i++){
        let aVal=parseInt(a[i]) || 0;
        let bVal=parseInt(b[i]) || 0;
        result=(aVal+bVal+carry)%10+result;
        carry=Math.floor((aVal+bVal+carry)/10)
    }
    if (carry>0){
       result=carry+result;
    }
    return result
}
console.log(addBigNumbersAsString("12345678901234567890", "98765432109876543210"));//111111111011111111100(正确)

4.使用第三方库(如big.js或bignumber.js)

如果你需要更复杂的大数运算(例如小数运算),可以考虑使用第三方库如big.js或bignumber.js。这些库提供了丰富的API来处理大数运算。
安装:

npm install bignumber.js

实现:

const BigNumber = require('bignumber.js');
function addBigNumbersWithLibrary(a, b) {
    return new BigNumber(a).plus(new BigNumber(b)).toString();
}

// 示例
console.log(addBigNumbersWithLibrary("12345678901234567890", "98765432109876543210"));//111111111011111111100(正确)

你可能感兴趣的:(前端,面试,javascript,前端,大数问题,bigint)