2012-12-24 58 views
0

我知道Java中的int範圍應該是-2^31到2^31-1。 但是當我用20運行此代碼片段:Java的int範圍?

public class Factorial { 
    public int factorial(int n) { 
     int fac=1; 
     for (int i=1; i<=n; i++) { 
      fac *= i; 
      System.out.println("Factorial of " + i + " is: " + fac); 
     } 

     return fac; 
    } 
} 

輸出:

Factorial of 1 is: 1 
Factorial of 2 is: 2 
Factorial of 3 is: 6 
Factorial of 4 is: 24 
Factorial of 5 is: 120 
Factorial of 6 is: 720 
Factorial of 7 is: 5040 
Factorial of 8 is: 40320 
Factorial of 9 is: 362880 
Factorial of 10 is: 3628800 
Factorial of 11 is: 39916800 
Factorial of 12 is: 479001600 
Factorial of 13 is: 1932053504 
Factorial of 14 is: 1278945280 
Factorial of 15 is: 2004310016 
Factorial of 16 is: 2004189184 
Factorial of 17 is: -288522240 
Factorial of 18 is: -898433024 
Factorial of 19 is: 109641728 
Factorial of 20 is: -2102132736 

這不是從13決策意識看起來它是超出範圍和周圍擠包。怎麼了?是由於我正在使用Eclipse嗎?

雖然我認爲這是不相關的,這裏是測試代碼:

public class TestFac { 

    public static void main(String[] args) { 
     int n; 
     Scanner sc = new Scanner(System.in); 

     System.out.println("Input num you want to factorial: "); 
     n = sc.nextInt(); 
     Factorial fac = new Factorial(); 
     fac.factorial(n); 
    } 

} 
+0

使用** long **數據類型而不是int。 – Dhinakar

+1

您應該首先檢查階乘13的實際值,看看它是否適合0和2^31 -1。不能指責Eclipse或Java的錯誤。就像發佈的答案一樣,長時間或甚至更好的BigInteger。 –

+4

恩,[2^31-1是2 147 483 647](https://www.google.com/search?q=2%5E31-1)和[13!是6 227 020 800](https://www.google.com/search?q=2%5E31-1)這是*更大*。 –

回答

3

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

int數據類型是一個32位有符號二進制補碼整數。它的最小值爲-2,147,483,648,最大值爲2,147,483,647(含)。對於整數值,這種數據類型通常是默認選擇,除非有一個原因(如上所述)選擇別的。這種數據類型很可能足夠大,以便您的程序使用的數字,但是如果您需要更寬範圍的值,請使用long。

道德故事:永遠不要盲目相信你的老師!

+4

故事的實際道德:仔細聆聽你的老師*。他說,*可能是正確的*。老師給你的哪些信息是錯誤的?從你發佈的內容來看,只有你的解釋看起來不對。 –

+0

你說得對。我錯認了10個力量和2個力量......確實是愚蠢的錯誤。 – Boyang

2

如果選中的Java整數,其最大值和最小值分別爲:

int MAX_VALUE = 2147483647 
int MIN_VALUE = -2147483648 

如果你做一些數學,你會看到(13階乘)1932053504 * 1427048749056這超出INT MAX_VALUE和這就是爲什麼你得到了14的階乘結果的錯誤。所以爲了獲得好的結果,最好使用long類型。

1

因子13是6227020800.這是31位以上的長度,因此它被纏繞。

如果你想支持大數字(例如任意長度),那麼考慮使用BigInteger類,它提供了無限的範圍。

18

這裏我想提一下整數時鐘的概念。 最大值和最小值在Java INT是 INT MAX_VALUE = 2147483647 INT MIN_VALUE = -2147483648

請檢查下面的結果

int a = 2147483645; 
for(int i=0;i<10;i++) { 
    System.out.println("a:"+ a++); 
} 

輸出:

a:2147483645 
a:2147483646 
a:2147483647 
a:-2147483648 
a:-2147483647 
a:-2147483646 
a:-2147483645 
a:-2147483644 
a:-2147483643 
a:-2147483642 

它示出了當你超出+ ve範圍整數的極限,下一個值從它的負起點值再次開始。

-2147483648,  <----------------- 
-2147483647,      | 
-2147483646,      | 
    .         | 
    .         | 
    .         | (next value will go back in -ve range) 
    0,         | 
+1,         | 
+2,         | 
+3,         | 
    .         | 
    .         | 
    .,         | 
+2147483645,      |  
+2147483646,      | 
+2147483647  --------------------- 

如果計算13的階乘是6227020800. 此值超出爪哇INT範圍。 那麼新值將是

 6227020800 
     - 2147483647 (+ve max value) 
    ----------------- 
Value = 4079537153 
     - 2147483648 (-ve max value) 
    ----------------- 
value = 1932053505 
    -    1 (for zero in between -ve to +ve value) 
    ---------------- 
Answer = 1932053504 

所以,在13你的答案階乘即將1932053504. 這是時鐘如何整數工作。

您可以使用長數據類型而不是整數來實現您的目的。 對於任何查詢,你可以在這裏發表。

0

請運行此代碼:

System.out.println("Minimum value of Integer is: " + Integer.MIN_VALUE); 
System.out.println("Maximum value of Integer is: " + Integer.MAX_VALUE); 

所以你可以看到失敗的原因。