我试图获得大量的剩余部分,例如:
1551690021432628813 % 64
但是我发现它对JavaScript来说太长了几位数。即它将四舍五入为零。
除了使用像BigInteger.js这样的26kb库之外,还有其他方法吗?
答案 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)
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