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
}