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