2012-12-24 59 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); 

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