JS的大数运算(注意:原生的只支持整数计算!!!)
- 一、JS的大数运算(注意:原生的只支持整数计算!!!)
- 1. 数字精度限制
- 2. 大数解决方案
- 2.1. 使用 BigInt
- 2.2. 使用第三方库
- 3. 总结
- 4 补充:力扣1922. 统计好数字的数目 (中等) 使用大数运算的例子
一、JS的大数运算(注意:原生的只支持整数计算!!!)
JavaScript 在处理数字时,其默认的数值类型是基于 IEEE 754 标准的双精度浮点数。这个数值类型有一些限制,特别是在进行大数运算时。以下是 JavaScript 中大数运算的简单介绍:
1. 数字精度限制
-
安全整数: JavaScript 支持的安全整数范围是 (-2^{53} + 1) 到 (2^{53} - 1)(即
Number.MAX_SAFE_INTEGER
的值为 9007199254740991)。超出这个范围的整数计算可能会出现精度丢失(例如,9007199254740992
会变成9007199254740992
)。 -
浮点数问题: 由于浮点数的表示方式,某些小数(如
0.1
和0.2
的和)可能无法精确表示。
2. 大数解决方案
由于上述限制,处理大数运算时,可以考虑以下几种方案:
2.1. 使用 BigInt
从 ES2020 开始,JavaScript 引入了 BigInt
类型,用于表示任意大小的整数。你可以通过在数字后添加 “n” 来创建 BigInt:
const bigInt1 = BigInt(9007199254740992)
const bigInt2 = 12345678901234567890n // 后缀 "n" 表示 BigInt
const sum = bigInt1 + bigInt2 // 可以进行大数运算
console.log(sum) // 输出: 12345678901234567892nconsole.log(Number(sum)) // 输出: 12345678901234567892
2.2. 使用第三方库
如果你需要支持比 BigInt 更广泛的数值(比如更复杂的数学操作、浮点数等),可以使用大数运算库,例如:
- Decimal.js: 支持任意精度的十进制运算,适合处理小数。
- Big.js: 提供了对大浮点数的高精度运算支持。
- bignumber.js: 可以处理比较大的数值以及高精度的浮点数运算。
使用示例(以 decimal.js
为例):
const Decimal = require('decimal.js');const a = new Decimal(0.1);
const b = new Decimal(0.2);
const sum = a.plus(b); // 精确计算
console.log(sum.toString()); // 输出: "0.3"
3. 总结
在 JavaScript 中,大数运算可以通过 BigInt
来实现任意大小的整数 整数 整数!!!
计算,或使用第三方库来处理更复杂的场景(如浮点数和高精度计算)。在处理大数运算时,需要注意原生数值类型的限制,以确保计算的准确性。
4 补充:力扣1922. 统计好数字的数目 (中等) 使用大数运算的例子
链接:csdn链接–作者暂未提供
链接:力扣本题链接
代码如下:
/*** @param {number} n* @return {number}*/
var countGoodNumbers = function (n) {// 此题无法使用暴力算法const MOD = BigInt(10 ** 9 + 7)// ai得到的逻辑思维:// 一个长度为n的字符串,偶数位置可以有02468五种选择,奇数位置可以有2357四种选择// 因此对其进行排列组合,可以得到好数字的个数一共是 (符合偶数位置的数字的个数 * 符合奇数位置的数字的个数)// 即 (5^evenFuhe) * (4^oddFuhe)const evenCount = BigInt(Math.ceil(n / 2)) // 偶数下标的数量const oddCount = BigInt(Math.floor(n / 2)) // 奇数下标的数量const count = (Fuhe(5n, evenCount, MOD) * Fuhe(4n, oddCount, MOD)) % MODreturn Number(count)
}// 快速幂运算的函数实现
const Fuhe = ( a, b, mod ) => {let ans = 1na = a % modwhile(b) {if( b & 1n) ans = (a * ans) % moda = (a * a) % modb >>= 1n}return ans
}