Skip to content

Latest commit

 

History

History
138 lines (90 loc) · 4.69 KB

1.BigInt 是什么? 解决了什么问题?.md

File metadata and controls

138 lines (90 loc) · 4.69 KB

本题难度:⭐

BigInt 是什么? 解决了什么问题?

答:BigInt 是 JS 的一种基本数据结构,类似于 Number 类型。用来精确(安全)地表示、存储和计算大整数。

mdn:
BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。

描述

可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,或者调用函数BigInt()

const num = 10
const num1 = 10n
const num2 = BigInt(10)

num1 === num2  // true
num1 == num    // true
num1 === num   // false

typeof num    // number
typeof num1   // bigint

运算

以下操作符可以和 BigInt 一起使用: +-*/**% 。除 >>> (无符号右移)之外的 位操作 也可以支持。因为 BigInt 都是有符号的, >>> (无符号右移)不能用于 BigInt

关于位运算不懂的可以看我的这篇文章:为了看懂 Vue3 diff算法,我学习了JS 位运算

const num = 32n

const num1 = num + 1 // 报错 Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

const num2 = num + 1n // 33n

const num3 = num - 1n // 31n

const num4 = num * 1n // 64n

const num5 = num / 2n // 32n

const num6 = num ** 2n // 1024n  **运算符相当于 Math.pow

const num7 = num % 30n // 2n

BigInt 解决了什么问题?

  • 直观表示大整数

  • 安全地存储和计算大整数

大整数表示

当输入一个比较长的数字时,JS 总是将其转换为科学计数,即使调用 toString() 方法,也无法获得它表示的真实数字。

用 BigInt 可以解决这个问题,正确地显示输入的数字,如下图,

image.png

调用 toString() 方法,依旧能够获得期望的数值,如下图,

image.png

安全地存储和计算大整数

JS 中,规定了语言所能够保证“安全”地进行计算的最大整数是Number.MAX_SAFE_INTEGER,也就是 2^53 - 1 (9007199254740991),超过了这个数值,计算就可能产生一些问题,比如,

image.png

用 BigInt 可以解决这个问题,正确地计算。

image.png

相关联算法题,用 JS 实现大整数相加

以前没有 BigInt 的时候,大整数相加是如何实现的呢?

思路是像小学学习加法时一样,在草稿本上画个类似这样的图,逢10进1做加法计算,然后处理一些边界问题。

image.png

function add(a, b) {
    let i = a.length - 1;
    let j = b.length - 1;

    let carry = 0;  // 存储进位
    let ret = '';
    while (i >= 0 || j >= 0) {
        let x = 0;
        let y = 0;
        let sum;

        if (i >= 0) {
            x = a[i] - '0';
            i --;
        }

        if (j >= 0) {
            y = b[j] - '0';
            j --;
        }

        sum = x + y + carry;  // 加上进位

        if (sum >= 10) {   // 逢 10 进 1
            carry = 1;
            sum -= 10;
        } else {
            carry = 0;
        }
        // 0 + ''
        ret = sum + ret;
    }

    if (carry) {
        ret = carry + ret;
    }

    return ret;
}

add('999999999999999999999999', '1') // '1000000000000000000000000'

以前还要封装函数来实现大整数运算,现在只需要调 BigInt 就行了,真方便。

小结

BigInt 可以精确地表示、存储和计算长整数。

我相信 JS 会越来越好,以后也能解决类似 0.1 + 0.2 !== 0.3 的精度问题的!

这是阿林持续更文的第29天,输出洞见技术,再会~

下一篇:

「前端每日一问(2)」symbol 是什么? 解决了什么问题?