铸造大数字

时间:2014-10-17 23:00:54

标签: java casting numbers

import java.util.Scanner;
public class Cast {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        double x = scan.nextDouble();
        double x1 = (int) x;
        System.out.println(x);
        System.out.println(x1);
    }
}

我正在开发一个简单的银行帐户计划。它工作正常,但是当我尝试输入一个大数字并且我投下它时,我的代码就会崩溃。我隔离了代码的一部分,看看我的代码是否有问题,或者是否是其他东西......所以我写得很快,发现当我输入一个像... 10000000000000000000这样的大数字时被转换为整数,结果是2.147483647E9。所以我认为这是一个铸造问题。

  1. 为什么会这样?
  2. 我可以做些什么来防止它发生或我还能做些什么来解决问题。

2 个答案:

答案 0 :(得分:1)

向下转换为int一个大数字的预期结果,该数字太大而无法放入int的有效范围内。您的Integer.MAX_VALUEdouble

Section 5.1.3 of the JLS州:

  

将浮点数转换为整数类型T需要两个步骤:

     
      
  1. 在第一步中,浮点数转换为long(如果T为long)或转换为int(如果T为byte,short,char或int),如下所示:

         
        
    • 如果浮点数为NaN(§4.2.3),则转换的第一步结果为int或long 0。
    •   
         

    一个。否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值V,使用IEEE 754舍入为零的模式(第4.2.3节)向零舍入。然后有两种情况:

         

    湾如果T很长,并且这个整数值可以表示为long,那么第一步的结果就是长值V.

         
        
    • 否则,如果此整数值可以表示为int,则第一步的结果是int值V.

    •   
    • 否则,以下两种情况之一必须为真:

    •   
         

    一个。该值必须太小(大幅度或负无穷大的负值),第一步的结果是int或long类型的最小可表示值。

         

    湾该值必须太大(大幅度或正无穷大的正值),第一步的结果是类型为int或long 的最大可表示值。

  2.   

(强调我的)

如果您需要保留该值,则可以尝试转换为long或使用BigInteger。如果这应该代表金钱,那么我只会使用BigDecimal来避免浮点表示和计算问题。

答案 1 :(得分:0)

这是由整数溢出引起的。 java中的整数可以保存32位,long可以保存64位。您可以使用Integer.MAX_VALUE和Long.MAX_VALUE来检索它可以容纳的最大数量。如果超过这个,则不会抛出任何异常,但整数将只是“溢出”。

要在Java中使用任意长度的数字,可以使用BigDecimal或BigInteger。这些是标准的Java类,它们很难处理,但永远不会溢出。 (你仍然可能会耗尽内存,但这当然会导致异常。)