Java和NodeJS中的变量“long”类型
我有一个Java函数:Java和NodeJS中的变量“long”类型,java,node.js,Java,Node.js,我有一个Java函数: private static int buildKey(String keystr) { char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' }; int len = keystr.length(); int i; long key; for (key = 1L, i = 0; i < len; i++) key += (ke
private static int buildKey(String keystr) {
char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' };
int len = keystr.length(); int i; long key;
for (key = 1L, i = 0; i < len; i++)
key += (keystr.charAt(i) * primes[i & 0x8]);
return (int)key % 64;
}
function buildKey(keystr) {
var primes = ["\022", "\030", "\012", "\020", "\045", "\043", "\053", ")"];
var len = keystr.length;
let key = 0;
for (let i = 0; i < len; i++) {
key += keystr.charAt(i).charCodeAt(0) * primes[i & 8].charCodeAt(0);
}
return key % 64;
}
我想将其更改为NodeJS,但我不知道如何使用long变量类型定义键,因为NodeJS中没有long类型
这是我当前的NodeJS函数,但Java函数upper的返回错误:
function buildKey(keystr) {
var primes = ["\085", "8r", "\082", "\087", "\083", "%", "\085", ")"];
var len = keystr.length;
var key = 1;
for (let i = 0; i < len; i++) {
key += keystr.charAt(i) * primes[i + 8];
console.log(parseInt(keystr.charAt(i)));
}
return key % 64;
}
有人同意我的建议吗?谢谢。Node.js从10.4版开始支持BigInts 您可以从文档中了解更多信息: 或此处的概述,与节点更相关:
ECMAScript中没有与Java的长数据类型等效的数据类型 ECMAScript中只有两种数字数据类型:和。ECMAScript number等效于Java double,即IEEE 754-2019二进制64双精度有符号64位二进制浮点数,ECMAScript bigint等效于Java biginger任意精度有符号二进制整数 两者都不能用wrapparound替换Java长的64位有符号二进制整数:数字只能精确表示精度为53位的整数,而biginteger不能用wrapparound替换 现在,最后,实际上您只使用了密钥的7位,因此,如果您小心的话,您可能可以以一种可以绕过这些限制的方式安排您的计算。例如,您可以将模运算移动到循环中,这样键的大小一开始就不会超过7位 如果我们可以证明Java代码中的long从不溢出,那么我们可以在ECMAScript中使用bigint,如果我们可以证明我们实际上只使用long的53位,那么我们可以使用bigint或number
很容易看出,在最坏的情况下,我们使用的是56位。这意味着,我们不能保证它将与number一起工作,但它应该与bigint一起工作。如果我们可以对keystr的长度和/或内容做出假设,那么我们可以进一步降低它。我用以下函数解决了我的问题:
private static int buildKey(String keystr) {
char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' };
int len = keystr.length(); int i; long key;
for (key = 1L, i = 0; i < len; i++)
key += (keystr.charAt(i) * primes[i & 0x8]);
return (int)key % 64;
}
function buildKey(keystr) {
var primes = ["\022", "\030", "\012", "\020", "\045", "\043", "\053", ")"];
var len = keystr.length;
let key = 0;
for (let i = 0; i < len; i++) {
key += keystr.charAt(i).charCodeAt(0) * primes[i & 8].charCodeAt(0);
}
return key % 64;
}
让钥匙来;?但这只提供了53位精度,而Java的long提供了63位精度。这就是你要问的吗?当我设置let key=0L时;have error SYNTAX错误:无效或意外的令牌0L无效代码您如何确定53位足够?从你问题中的信息来看,我能得出的最佳界限是56位。您需要对keystr进行额外的约束来改进这一点。那个些允许你们使用数字的信息是什么?