簡體   English   中英

JavaScript 中大數的除法和余數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM