Javascript中的Java int操作

时间:2014-02-06 01:25:41

标签: java javascript porting

使用大整数时,Java和Javascript会产生不同的结果。

示例: getCode(1747,1763,-268087281,348400)在Java中返回1921968083但Javascript返回2.510115715670451e+22

如何使用Javascript在Java中获得结果?

做了一些研究后,这个问题似乎与有符号/无符号32/64位整数运算有关。我尝试将|0添加到所有操作中,并使1921618368更接近但不相同。

爪哇:

public String getCode(int intVal1, int intVal2, int intVal3, int IntA) {
    int intVal5 = intVal2 ^ intVal3  ;
    intVal5 = intVal5 + (intVal1 | IntA )  ;
    intVal5 = intVal5 * (intVal1 | intVal3  ) ;
    intVal5 = intVal5 * (intVal2 ^ IntA )  ;
    return String.valueOf(intVal5);
}

使用Javascript:

function getCode(intVal1,intVal2,intVal3,IntA)  {
    var intVal5 = intVal2 ^ intVal3  ;
    intVal5 = intVal5 + (intVal1 | IntA )  ;
    intVal5 = intVal5 * (intVal1 | intVal3  ) ;
    intVal5 = intVal5 * (intVal2 ^ IntA )  ;
    return intVal5;
}

1 个答案:

答案 0 :(得分:1)

|0技巧适用于JavaScript中的大多数操作以模拟32位整数,但不适用于乘法。这是因为乘以两个大的int可能会导致数字太大而超出JavaScript的本机double类型的整数精度。一旦将其强制转换为int,则该值略有错误。

为了解决这个问题,引入了Math.imul来执行真正的int乘法。这是非常新的,因此浏览器支持自然会排除IE。但好消息是:链接页面包含一个替换函数,可以模拟旧浏览器的imul,它可以分别乘以数字的上半部分和下半部分。

以下是修复功能的方法。它在添加后使用|0,并在Math.imul进行乘法运算:

function getCode(intVal1, intVal2, intVal3, IntA) {
    var intVal5 = intVal2 ^ intVal3;
    intVal5 = intVal5 + (intVal1 | IntA) | 0;
    intVal5 = Math.imul(intVal5, (intVal1 | intVal3));
    intVal5 = Math.imul(intVal5, (intVal2 ^ IntA));
    return intVal5;
}
alert(getCode(1747, 1763, -268087281, 348400));

输出为1921968083,与Java相同。