2017-06-04 17 views
3

我有一個公式來評估不同了在Java相同的函數的Python

((x+y-1)*(x+y-2))/2 + x 

,並得到它的字符串表示。 所以在Java中1.7我寫

public static void main(String[] args) 
{ 
    int x = 99999; 
    int y = 99999; 
    int answer = ((x+y-1)*(x+y-2))/2 + x; 
    String s = Integer.toString(answer); 
    System.out.println(s); 
} 

,並在Python 2.7

def answer(x, y): 
    z = ((x+y-1)*(x+y-2))/2 + x 
    return str(z); 

print(answer(99999,99999)) 

的Java給我放出來的672047173而Python給了我19999400005,似乎從Python的值是正確的。造成這種差異的原因是什麼?

回答

6

19999400005int變量太大的價值,所以在Java計算將溢出。

使用long變量來代替:

public static void main(String[] args) 
{ 
    long x = 99999; 
    long y = 99999; 
    long answer = ((x+y-1)*(x+y-2))/2 + x; 
    String s = Long.toString(answer); 
    System.out.println(s); 
} 

輸出是:

19999400005 

另外請注意,您可以直接打印answer並沒有將其轉換爲String明確:

System.out.println(answer); 
+1

的Java計算絕對溢在這種情況下。 – syntagma

+0

來自我的愚蠢錯誤。感謝您的解釋。 –

3

因爲java中的整數範圍是m最小值爲-2,147,483,648,最大值爲2,147,483,647。

int answer =((x + y-1)*(x + y-2))/ 2 + x;

在這一行要分配更高範圍值爲整數。它會導致算術運算的整數溢出。所以這就是爲什麼你得到不正確的值,以獲得正確的值,你必須使用數據類型。

public static void main(String[] args) 
{ 
    int x = 99999; 
    int y = 99999; 
    long answer = (((x+y-1)*1l)*((x+y-2)*1l))/2 + x; 
    String s = Long.toString(answer); 
    System.out.println(s); 
} 
+0

這仍然不起作用。 'int * int'在'int'中給出結果,然後把它賦給'long',所以你仍然可以通過'整數溢出'來獲得答案。如果你想用'integer'來做同樣的事情,你可以做'1L *(x + y-1)*(x + y-2)',現在這個'long'中的乘法運算。 –

+0

你錯了。隱式轉換將在乘法運算完成後進行,乘法運算將以整型數據類型完成,這將導致溢出並給出錯誤答案。你可以通過運行你的代碼片段來檢查。 –

+0

謝謝。我想你是對的。 – Ankur

相關問題