• 作者:老汪软件技巧
  • 发表时间:2024-09-07 07:03
  • 浏览量:

前言

本文将带大家去了解前端如何做大整数加法计算

安全值

在做大整数计算之前,我们先介绍一下安全值

由于 JavaScript 的Number类型使用 IEEE 754 双精度浮点数表示数字由于 JavaScript 的Number类型使用 IEEE 754 双精度浮点数表示数字

也就是说超出这个值的计算,前端直接计算会出现安全问题

所以es6之后才打造了bigint用于做大整数的计算

代码实现

// 定义大整数
const largeNumber1 = BigInt("111111111111111111111111111111");
const largeNumber2 = BigInt("222222222222222222222222222222");
// 加法
const sum = largeNumber1 + largeNumber2;
console.log("Sum:", sum.toString()); // 输出: Sum: 333333333333333333333333333333
// 减法
const difference = largeNumber2 - largeNumber1;
console.log("Difference:", difference.toString()); // 输出: Difference: 111111111111111111111111111111
// 乘法
const product = largeNumber1 * largeNumber2;
console.log("Product:", product.toString()); // 输出: Product: 246913580246913580246913580246913580246913580246913580
// 除法
const quotient = largeNumber2 / largeNumber1;
console.log("Quotient:", quotient.toString()); // 输出: Quotient: 2
// 取余
const remainder = largeNumber2 % largeNumber1;
console.log("Remainder:", remainder.toString()); // 输出: Remainder: 111111111111111111111111111111

BigInt不能与普通的Number类型直接混合运算。如果需要,可以将Number转换为BigInt:

```js
const num = 10;
const bigIntResult = largeNumber1 + BigInt(num);
```

虽然可以使用bigint简单明了的解决这个问题

但是这个时候你就会听到面试官说:“我就要你不用bigint给我做出来”

这个时候你就可以和面试官说:“你是不是S。。。啊不,我当然可以做出来的呀,我这就给您写出来代码呀,请稍等呀,面试官大人”

function add(num1, num2){
    let result = "";
    let carry = 0
    let i = num1.length - 1
    let j = num2.length - 1
    while(i >= 0 || j >= 0 ){
        // 获取当前位的数字
        let digit1 = parseInt(num1[i])
        let digit2 = parseInt(num2[j])
        // 拿到当前位的结果
        let sum = digit1 + digit2 + carry
        let currentDigit = sum % 10
        result = currentDigit + result
        // 计算进位
        carry = Math.floor(sum / 10)
        i--
        j--
    }
    // 返回字符串结果
    return result
}function add(num1, num2){
    let result = "";
    let carry = 0
    let i = num1.length - 1
    let j = num2.length - 1
    while(i >= 0 || j >= 0 || carry > 0){
        // 获取当前位的数字
        let digit1 = parseInt(num1[i])
        let digit2 = parseInt(num2[j])
        // 拿到当前位的结果
        let sum = digit1 + digit2 + carry
        let currentDigit = sum % 10
        result = currentDigit + result
        // 计算进位
        carry = Math.floor(sum / 10)
        i--
        j--
    }
    // 返回字符串结果
    return result
}
const num1 = "111111111111111111111111111111";
const num2 = "111121111211112111121111211112";
const sum = add(num1, num2);
console.log("Sum: ", sum);

可以看到结果也是没得问题的