使用大整数时,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;
}
答案 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相同。