JavaScript中大数的除法和余数

JavaScript中大数的除法和余数,javascript,math,Javascript,Math,我试图得到一个大数字的剩余部分,例如: 15516900214328813%64 但是我发现对于JavaScript来说,它有两位数太长了。i、 它正四舍五入到零 除了使用像这样的26kb库之外,还有其他解决方法吗?你必须使用一个库(就像你找到的那个库)。JavaScript的数字(双精度二进制浮点)在这个尺度上是不精确的,而这些是JavaScript仅有的一种数字*。一旦您通过Number.MAX_SAFE_INTEGER+1(9007199254740992),JavaScript的数字就不

我试图得到一个大数字的剩余部分,例如:

15516900214328813%64

但是我发现对于JavaScript来说,它有两位数太长了。i、 它正四舍五入到零


除了使用像这样的26kb库之外,还有其他解决方法吗?

你必须使用一个库(就像你找到的那个库)。JavaScript的数字(双精度二进制浮点)在这个尺度上是不精确的,而这些是JavaScript仅有的一种数字*。一旦您通过
Number.MAX_SAFE_INTEGER+1
(9007199254740992),JavaScript的数字就不能再代表每个整数(例如,不能代表9007199254740993)



*除了类型化数组的元素类型之外,这些元素类型对您没有帮助,原因有二:1。
Uint64
没有类型化数组,最大的整数是
Uint32
,2。一旦您对条目执行数学运算,您就可以将其转换为标准数字。

有一些解决方法,但通常最容易使用库

您可以将数字分成10位数的块(从右侧开始),并对块执行模块运算,最后将结果合并:

1551690021432628813 = 155169002 * 10**10 + 1432628813
因此

(等于
13

您可以编写一个递归函数来实现这个想法。以下是Python语言(我更精通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
比如说,

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;
        }
    }
函数calculateMod(str,mod){
var n=str.length;
如果(n
//您可以使用内置的BigInt对象

console.log(编号(15516900214328813N%64n));
如果有一个库可以满足您所需的操作,那就太好了,例如remainers上面的链接说明了如何实现“基于字符串的除法”手动。你考虑过这个方法吗?谢谢你的解释。我不能使用一个和我在那里发现的一样大的图书馆。我猜一个好的解决办法就是一个只提供我需要的操作的图书馆。remainder@Seano:FWIW,是“8K缩小并压缩”的。在当今世界的大多数情况下,这算不了什么。(我从来没有用过它,它只是我碰巧知道的一个。)我很感激,但我不能使用gzip。它仍然是小型的26kb@Seano:你必须使用令人惊讶的过时技术才能使用gzip;即时gzip是一种web服务器功能,存在于任何一个不太像样的web服务器中。但是他们的网站已经过时或是打字错误;在我看来,缩小版是85k,而gzip是19k在电线上。这在现代世界还不算大——但也不是8k!:-)你怎么把
1551690021432628813
?表示成一根线?@JohnColeman是的
1551690021432628813 % 64 = 628813 % 64 = 13
    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;
        }
    }