用 Java 重写的 Javascript 函数给出了不同的结果

标签 javascript java

我正在尝试用 Java 重写这个 Javascript 函数:

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 条件内部:在 if encodingRound2 = 2340070528 之后的 Javascript 函数中, 在 Java 中:encodingRound2 = -1954896768 .

我制作了这些回复以在线显示:

Javascript:https://repl.it/repls/NumbGuiltyHack

java :https://repl.it/repls/ClumsyQualifiedProblem

编辑 : 将 Java 函数更改为此
public long normalizeHash(long encondindRound2) {
        if (encondindRound2 < 0) {
            encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
        }
        return (encondindRound2 % 1_000_000);
    }

似乎不影响结果 - 它仍然是 -896768

最佳答案

在 Java 中,0x80000000 超出了 32 位 int 的范围,因此它回绕到 -2147483648。

在 JavaScript 中,0x80000000 完全在 64 位 double 的范围内,所以它仍然是 2147483648。

显然,添加 -2147483648与添加 2147483648导致非常大的差异。

您可以使用 long Java 中的 0x80000000L,或使用 (0x80000000|0) 将您的 JS 编号强制转换为 32 位整数,取决于你想要的。

关于用 Java 重写的 Javascript 函数给出了不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994440/

相关文章:

javascript - Spring MVC Js 和 css 不加载

java - 是否可以在 Android 设备上安装 JDK?

java - “App won' t 运行,除非您使用 Google Maps API 更新 Google Play 服务

javascript - 如何修改域名后的路径更加友好?

javascript - jQuery 在点击时根据用户输入创建列表项

java - ADMOB-java.lang.IllegalStateException : isLoaded must be called on the main UI thread

java - Spring Boot - Hibernate,异常时回滚成功保存

java - Spring无法创建bean

javascript - 当<a>包含使用javascript的子元素时如何获取<a>标签的 'aria-label'属性

javascript - 抛出 JavaScript 异常的标准做法是什么?