在 JavaScript 中,数字是一种非常重要的数据类型。然而,由于 JavaScript 采用双精度浮点数格式(64位),因此它有一个固定的数字边界:$2^{53}$。在实践中,对于很多应用,这个数字边界已经足够了。但是,在涉及到大数值和精度问题的场景下,这个边界还是有一些限制的。在 ECMAScript 2020,也就是 ES11 版本中,引入了一个新的数据类型 BigInt ,以解决 JavaScript 中数字大小限制的问题。
什么是 BigInt
BigInt 是 ES11 新增的一种原始数据类型,用于表示大整数,它可以大于 $2^{53}$。在 JavaScript 中,BigInt 的一个主要应用场景是密码算法和高精度计算。
BigInt 是一个对象,使用时需要在数字后面添加一个 n ,表示这个数字是一个 BigInt。
const num = 9007199254740992n; console.log(typeof num); // "bigint"
BigInt 的优缺点
相对于 JavaScript 中的传统数字类型,BigInt 有一些优缺点。
优点
- 没有数字大小限制。由于 JavaScript 采用双精度浮点数格式,数字最大只能达到 $2^{53}$。BigInt 可以表示比 $2^{53}$ 更大的数字。
- 更精准的计算结果。在进行一些浮点数运算时,由于浮点数只能精确表示一些有限的小数,因此有些运算结果将保留 isprecision,造成损失。BigInt将可以避免此问题。
- 更高的可读性。由于BigInt在数值后添加了一个n表示,与传统数值相比具有更好的可读性。
缺点
- 执行时间更长。由于 BigInt 中包含大量的位数,计算机需要同时处理这些位数,因此 BigInt 结果的运算速度较慢。
- 内存消耗更大。BigInt 占用的内存比传统数字类型更大。
BigInt 与传统数字类型的比较
BigInt 与 JavaScript 中的传统数字类型有很多区别。
常规数字类型
传统数字类型具有处理一些简单的数字运算时的简洁和速度优势。但它们具有数字大小的限制,可能导致精度方面的问题。
const num1 = 1000000000000000000000; const num2 = 100000000000000000000; console.log(num1 + num2); // 1100000000000000000000
在以上示例中,由于使用的是常规数字类型,因此计算结果产生了精度损失。
BigInt
BigInt 具有处理任意位数数字的优势,但却不能像常规数字类型那样执行简单的数字运算。
const num1 = 1000000000000000000000n; const num2 = 100000000000000000000n; console.log(num1 + num2); // 1100000000000000000000n
在这个示例中,我们使用 BigInt 优化了数字精度,确保没有出现精度损失。
如何使用 BigInt
要使用 BigInt,请在数字末尾添加一个 n ,表示它是一个 BigInt 值。可以使用相同的数学操作符或函数与 BigInt 一起使用,如 +、-、*、/ 和 Math.floor 等。
以下是一些在 JavaScript 中使用 BigInt 的示例代码:
// www.javascriptcn.com code example const bigNumber = 1000000000000000000000n; const result = bigNumber * 123n; console.log(result); // 1230000000000000000000000n const maxSafe = Number.MAX_SAFE_INTEGER; console.log(maxSafe); // 9007199254740991 console.log(BigInt(maxSafe)); // 9007199254740991n const a = 2n ** 53n; console.log(a); // 9007199254740992n const bigNumberString = '90000000000000000001'; console.log(BigInt(bigNumberString)); // 90000000000000000001n
以上代码包括了一些使用 BigInt 的示例,它们展示了 BigInt 处理任意大小数字的能力和与普通数字类型的差异。
结语
在 JavaScript 语言中,BigInt 是一个很有用的原始数据类型,它提供了一种更为精确的数字运算方式,可以避免传统数字类型存在的数字大小限制。匆大部分情况下,我们可以继续使用常规数字类型,但在某些特殊场景下,BigInt 可以发挥其重要作用,优化开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d5d589a941bf7134b217f1