Є ця функція Javascript, яку я намагаюся переписати на Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Моя адаптація Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Коли я проходжу -1954896768, версія Javascript повертається 70528, а Java повертається -896768. Я не впевнений, чому. Здається, різниця починається всередині умови if: у функції Javascript після if encodingRound2 = 2340070528, тоді як у Java : encodingRound2 = -1954896768.
Я зробив ці відповіді, щоб показати це в Інтернеті:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDIT : Зміна функції Java на цю
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
не здається, що це впливає на результат - все одно -896768
longрізні результати через переповнення.
(int)return-896768
... + 0x80000000Java перетворює значення в int, оскільки 0x80000000вважається int буквалом. Змініть це число на 0x80000000L.
encondindRound2наintв коді Java? Оскільки це визначено як "a"long, ви потенційно втратите точність, якщо відкинете його на більш вузький тип.