JavaScript中的大数字的除法和余数

时间:2017-07-06 11:58:07

标签: javascript math

我试图获得大量的剩余部分,例如:

1551690021432628813 % 64

但是我发现它对JavaScript来说太长了几位数。即它将四舍五入为零。

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

5 个答案:

答案 0 :(得分:2)

您可以将数字分成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的幂,类似的评论就会成立。

答案 1 :(得分:1)

您必须使用图书馆(就像您找到的那样)。 JavaScript的数字(IEEE-754双精度二进制浮点数)在那个规模上并不准确,而且这些是JavaScript具有*的唯一数字。一旦超过Number.MAX_SAFE_INTEGER + 1(9,007,199,254,740,992),JavaScript的数字就不能代表每个整数(例如,不能代表9,007,199,254,740,993)。

*除了类型化数组的元素类型之外,但是那些不能帮助您解决这个问题有两个原因:1。Uint64没有类型化数组,最大的整数是Uint32,以及2.在您对该条目执行数学运算后,您需要将其转换为标准数字。

答案 2 :(得分:0)

谢谢John Coleman

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;
        }
    }

答案 3 :(得分:0)

// you can use the built-in BigInt object
console.log(Number(1551690021432628813n % 64n));

答案 4 :(得分:-1)

有一些解决方法,但通常最简单的方法是使用库Read more