Java 大量铸造
我正在做一个简单的银行账户程序。它工作得很好,但是当我尝试输入一个大的数字并进行转换时,我的代码就崩溃了。我隔离了代码的一部分,看看是不是我的代码出了问题,还是其他什么问题。。。所以我很快写了这篇文章,发现当我输入一个大数字时,比如。。。100000000000000000并将其转换为整数,结果为2.147483647E9。所以我觉得这是演员的问题Java 大量铸造,java,casting,numbers,Java,Casting,Numbers,我正在做一个简单的银行账户程序。它工作得很好,但是当我尝试输入一个大的数字并进行转换时,我的代码就崩溃了。我隔离了代码的一部分,看看是不是我的代码出了问题,还是其他什么问题。。。所以我很快写了这篇文章,发现当我输入一个大数字时,比如。。。100000000000000000并将其转换为整数,结果为2.147483647E9。所以我觉得这是演员的问题 为什么会发生这种情况 我能做些什么来防止它发生,或者我还能做些什么来解决问题 这是向下转换到int的预期结果,该数值太大,无法适应int的有效范围。
这是向下转换到
int
的预期结果,该数值太大,无法适应int
的有效范围。您将获得整数.MAX_值作为双精度
国家:
将浮点数缩小为整数类型T需要两个步骤:
在第一步中,如果T为long,则将浮点数转换为long;如果T为byte、short、char或int,则将浮点数转换为int,如下所示:
- 如果浮点数为NaN(§4.2.3),则转换的第一步结果为int或long 0
a。否则,如果浮点数不是无穷大,则将浮点数四舍五入为整数值V,使用IEEE 754向零舍入模式(第4.2.3节)向零舍入。然后有两种情况:
b。如果T是长的,并且这个整数值可以表示为长的,那么第一步的结果就是长值V
- 否则,如果这个整数值可以表示为int,那么第一步的结果就是int值V
- 否则,以下两种情况之一必须为真:
a。该值必须太小(大数值的负值或负无穷大),并且第一步的结果是int或long类型的最小可表示值
b。该值必须太大(大数值的正值或正无穷大),并且第一步的结果是int或long类型的最大可表示值
(强调矿山)
如果需要保留该值,则可以尝试强制转换为long
或使用biginger
。如果这应该表示货币,那么我只会使用BigDecimal
来避免浮点表示和计算问题。这是由整数溢出引起的。java中的整数可以容纳32位,长整数可以容纳64位。您可以使用Integer.MAX_值和Long.MAX_值来检索它可以容纳的最大值。如果超过此值,则不会引发异常,但整数将只是“溢出”
要在Java中处理任意长度的数字,可以使用BigDecimal或BigInteger。这些是标准的Java类,很难处理,但永远不会溢出。(内存可能仍然不足,但这当然会导致异常。)因为int
的值不能大于2^31-1。这是2147483647。int
的最大可能值是2147483647。如果需要大于该值的数字,请不要使用int
。使用。不要将其扫描为double
。使用next()
将令牌扫描为字符串
,然后使用该字符串构造一个BigInteger
。
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);
}
}