[英]Division and remainder of large numbers in JavaScript
我正在嘗試獲取大量的剩余部分,例如:
1551690021432628813 % 64
但我發現它對於 JavaScript 來說太長了幾個數字。 即它四舍五入為零。
除了使用像BigInteger.js這樣的 26kb 庫之外,還有其他解決方法嗎?
您可以將數字分成 10 位數字的塊(從右邊開始)並對塊進行模塊化運算,最后合並結果:
1551690021432628813 = 155169002 * 10**10 + 1432628813
因此
1551690021432628813 % 64 = (155169002 % 64 * (10**10) % 64 + 1432628813 % 64) % 64
(等於13
)。
您可以編寫一個實現此想法的遞歸函數。 以下是 Python 語言(我比較流利),但應該很容易翻譯成 JavaScript:
def remainder(s,m):
#computes int(s) % m, while just using small numbers
#s is a string and m is an integer
n = len(s)
if n <= 10:
return int(s) % m
else:
first = s[:n-10] #first n-10 digits in s
second = s[-10:] #last 10 digits
return (remainder(first,m) * ((10**10) % m) + int(second) % m) % m
對於模數為64
的特殊情況,有一個非常簡單的方法: 64 divides 10**6
所以,絕對總是
n % 64 == (last 6 digits of n) % 64
例如,
1551690021432628813 % 64 = 628813 % 64 = 13
只要模數是 2 的冪,類似的說法就成立。
javascript 版本:
function calculateMod(str, mod) {
var n = str.length;
if (n <= 10) {
return parseInt(str) % mod;
}
else {
var first = str.substring(0, n - 10)
var second = str.substring(n - 10)
return (calculateMod(first, mod) * (Math.pow(10, 10) % mod) + parseInt(second) % mod) % mod;
}
}
你必須使用一個圖書館(就像你找到的那個)。 JavaScript 的數字( IEEE-754雙精度二進制浮點數)在那個規模上並不准確,而這些是 JavaScript 擁有的唯一一種數字*。 一旦你超過Number.MAX_SAFE_INTEGER + 1
(9,007,199,254,740,992),JavaScript 的數字就不能再表示每個整數(例如,不能表示 9,007,199,254,740,993)。
* 除了類型化數組的元素類型之外,這些對您沒有幫助,原因有二:1. Uint32
沒有類型化數組,最大整數是Uint64
,以及 2. 一旦您對條目,您正在將其轉換為標准數字。
// you can use the built-in BigInt object console.log(Number(1551690021432628813n % 64n));
有一些解決方法,但通常最簡單的方法是使用庫閱讀更多
BigInt(1551690021432628813) % 64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.