我正在尝试获取一个大数的余数,例如:
1551690021432628813 % 64
但是我发现这个数字对于JavaScript来说太长了,即会被四舍五入为零。
除了使用一个26kb的库,例如BigInteger.js,是否有其他解决方法?
我正在尝试获取一个大数的余数,例如:
1551690021432628813 % 64
但是我发现这个数字对于JavaScript来说太长了,即会被四舍五入为零。
除了使用一个26kb的库,例如BigInteger.js,是否有其他解决方法?
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;
}
}
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可以整除10**6
,所以绝对总是成立。
n % 64 == (last 6 digits of n) % 64
例如,
1551690021432628813 % 64 = 628813 % 64 = 13
当模数是2的幂时,类似的评论同样适用。
您需要使用一个库(比如您找到的那个)。JavaScript 的数字(IEEE-754 双精度二进制浮点数)在该规模下不够准确,而这是 JavaScript 所有数字类型中唯一的一种。一旦超过 Number.MAX_SAFE_INTEGER + 1
(9,007,199,254,740,992),JavaScript 的数字就无法再表示每一个整数(例如,无法表示 9,007,199,254,740,993)。
Uint64
类型化数组,最大整数是Uint32
,2. 一旦您对条目执行数学运算,就会将其转换为标准数字。// you can use the built-in BigInt object
console.log(Number(1551690021432628813n % 64n));
BigInt(1551690021432628813) % 64
大整数(1551690021432628813)% 64
1551690021432628813
的?作为字符串吗? - John Coleman