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。所以我认为这是一个铸造问题。
答案 0 :(得分:1)
向下转换为int
一个大数字的预期结果,该数字太大而无法放入int
的有效范围内。您的Integer.MAX_VALUE
为double
。
将浮点数转换为整数类型T需要两个步骤:
- 醇>
在第一步中,浮点数转换为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 的最大可表示值。
(强调我的)
如果您需要保留该值,则可以尝试转换为long
或使用BigInteger
。如果这应该代表金钱,那么我只会使用BigDecimal
来避免浮点表示和计算问题。
答案 1 :(得分:0)
这是由整数溢出引起的。 java中的整数可以保存32位,long可以保存64位。您可以使用Integer.MAX_VALUE和Long.MAX_VALUE来检索它可以容纳的最大数量。如果超过这个,则不会抛出任何异常,但整数将只是“溢出”。
要在Java中使用任意长度的数字,可以使用BigDecimal或BigInteger。这些是标准的Java类,它们很难处理,但永远不会溢出。 (你仍然可能会耗尽内存,但这当然会导致异常。)