2014-02-06 23 views
0

当使用大整数操作时,Java和Javascript会产生不同的结果。JavaScript中的Java int操作

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

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

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

的Java:

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; 
} 
+4

欢迎来到Stack Overflow!要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或者添加打印语句)来分析问题,追踪程序的进度,并将其与预期发生的情况进行比较。只要两者发生分歧,那么你就发现了你的问题。 (然后如果有必要,你应该构造一个[最小测试用例](http://sscce.org)。) –

+2

为什么使用php?请检查您的标签 –

+1

JavaScript中没有ints。解释算法而不是仅仅向我们倾倒代码可能是有用的。 –

回答

1

|0技巧适用于大多数的操作在JavaScript中模拟32位整数,但不是乘法。这是因为乘以两个较大的整数可能会导致数字太大,以至于超过了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。