2014-02-06 26 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。