Existe esta função Javascript que estou tentando reescrever em Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Minha adaptação Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Quando passo -1954896768
, a versão Javascript retorna 70528
, enquanto Java retorna -896768
. Não sei por que. A diferença parece começar dentro da condição if: em função Javascript após o caso encodingRound2 = 2340070528
, enquanto em Java: encodingRound2 = -1954896768
.
Fiz essas réplicas para mostrá-lo on-line:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDIT : Alterando a função Java para este
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
parece não afetar o resultado - ainda é -896768
javascript
java
parsecer
fonte
fonte
encondindRound2
para umint
no código Java? Como é definido como along
, você provavelmente perderá precisão se a converter para um tipo mais restrito.long
deu resultados diferentes, por causa do estouro.(int)
elenco dareturn
linha não altera o resultado do Java, ele permanece-896768
... + 0x80000000
, Java converte o valor em um int, porque0x80000000
é considerado um literal int. Mude esse número para0x80000000L
.Respostas:
Em Java, 0x80000000 está fora do intervalo de um int de 32 bits e, portanto, se aproxima de -2147483648.
No JavaScript, 0x80000000 está bem dentro do intervalo de um dobro de 64 bits e permanece 2147483648.
Obviamente, adicionar
-2147483648
vs adicionar2147483648
resulta em uma discrepância muito grande.Você pode usar um
long
0x80000000L em Java ou coagir seu número JS em um int de 32 bits(0x80000000|0)
, dependendo do que você deseja.fonte
Tente isso. Você precisa especificar valores longos ao fazer a conversão.
Mas há outro problema que você deve estar ciente. O Javascript trata
%
como um operador de módulo, enquanto o Java o trata como um operador simples de restante. Confira este post aqui para mais informações.fonte