Java 大量铸造

Java 大量铸造,java,casting,numbers,Java,Casting,Numbers,我正在做一个简单的银行账户程序。它工作得很好,但是当我尝试输入一个大的数字并进行转换时,我的代码就崩溃了。我隔离了代码的一部分,看看是不是我的代码出了问题,还是其他什么问题。。。所以我很快写了这篇文章,发现当我输入一个大数字时,比如。。。100000000000000000并将其转换为整数,结果为2.147483647E9。所以我觉得这是演员的问题 为什么会发生这种情况 我能做些什么来防止它发生,或者我还能做些什么来解决问题 这是向下转换到int的预期结果,该数值太大,无法适应int的有效范围。

我正在做一个简单的银行账户程序。它工作得很好,但是当我尝试输入一个大的数字并进行转换时,我的代码就崩溃了。我隔离了代码的一部分,看看是不是我的代码出了问题,还是其他什么问题。。。所以我很快写了这篇文章,发现当我输入一个大数字时,比如。。。100000000000000000并将其转换为整数,结果为2.147483647E9。所以我觉得这是演员的问题

  • 为什么会发生这种情况
  • 我能做些什么来防止它发生,或者我还能做些什么来解决问题
    这是向下转换到
    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);
        }
    }