【问题标题】:Given string representation of int, check overflow给定int的字符串表示,检查溢出
【发布时间】:2016-10-29 23:48:19
【问题描述】:

鉴于intString 表示,我想检查溢出。

我知道如何使用 java 的内置函数(如 parseInt)从 int 转换 String。 但是如果String 太大以至于它可能不适合int 怎么办?

String str = "214748364781";
int res = Integer.parseInt(str);

我试图检查String 表示的符号,执行parseInt,如果符号不匹配,那么我可以说它确实溢出了,因为int 环绕,但是当我实际运行它时它抛出NumberFormat 异常。

NumberFormat 会针对任何格式错误的字符串抛出,因此不能保证溢出。

所以我可以检查输入字符串的格式是否正确(所有数字),然后执行parseInt,然后如果我得到NumberFormat,我可以断定错误是由于溢出造成的。

但是,我觉得应该有更短的方法来做这个检查。

【问题讨论】:

    标签: java integer


    【解决方案1】:

    将其解析为Long,如果有效,则将其解析为Integer,如果此时抛出异常,则会溢出。

    将其解析为Long 并检查它是否大于Integer.MAX_VALUE

    【讨论】:

      【解决方案2】:

      您可以将其解析为BigInteger 并检查它是否大于Integer.MAX_VALUE

      BigInteger maxIntBigInteger = BigInteger.valueOf(Integer.MAX_VALUE);
      String str = "214748364781";
      BigInteger bi = new BigInteger(str);
      if (bi.compareTo(maxIntBigInteger) > 0) {
          System.out.println("Number is too big");
      } else {
          int res = bi.intValue();
          System.out.println(res);
      }
      

      【讨论】:

        【解决方案3】:

        只是给你一个不同的选择,如果你想做的只是检查你的字符串是否不会溢出,你可以按字典顺序进行比较。字符串比较通常比解析为数字快得多。

        假设只有正整数。

            String number = "2147483649";
            String int_max = "2147483647";
        
            if (number.length() > int_max.length())
            {
                System.out.println("OVERFLOW");
            }
            else if (number.length() == int_max.length()){
                int comparison = number.compareTo(int_max);
                System.out.println(comparison > 0 ? "OVERFLOW" : "");
            }
        

        现在,在现实生活中,如果您可能有大整数,您应该按照其他答案中的建议使用 Long 或 BigInteger。

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          如果您使用的是 Java 8,则可以将其解析为 Long 类型,然后使用 Math.toIntExact(long value) 获取 int 值。如果存在溢出,这将引发未经检查的 ArithmeticException

          以下是您的代码示例:

          String str = "214748364781";
          int res = Math.toIntExact(Long.parseLong(str));
          

          或者进一步简化:

          int res = Math.toIntExact(Long.parseLong("214748364781"));
          

          正如预期的那样,我们得到整数溢出异常如下:

          Exception in thread "main" java.lang.ArithmeticException: integer overflow
              at java.lang.Math.toIntExact(Math.java:1011)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-22
            • 2014-04-30
            • 2012-11-19
            相关资源
            最近更新 更多