【问题标题】:compile error, too large integer. CreditCardAnalysis.Java编译错误,整数太大。信用卡分析.Java
【发布时间】:2013-10-28 16:06:02
【问题描述】:

我正在努力弄清楚我的代码中的编译/语法错误是什么。

public class CreditCardValidation {

    public static void main (String[] args){

        System.out.print(prefixMatched(4388576018402626, 4388));

    }

    /*
    Return the number of digits in d
    */

    public static int getSize(long d) {

        int size = 0 ;

        while( d > 0 ) {
            d = d / 10 ;
            size = size + 1 ;       
        }
        return size ;
    }

    /*
    Return the first k number of digits from number. If the number of digits in number is 
    less than k, return the number.
    */

    public static long getPrefix(long n, int k) {

        int f = getSize(n)-k;

        long prefix = n/((int)(Math.pow(10, f)));

        return prefix;
        }

    /*
    Return true if the digit d is a prefix for number.
    */

    public static boolean prefixMatched( long number, int d ) {

        if ( d == getPrefix(number, 4))

            return true ;
        else
            return false ;

        }

    }

如您所见,我正在尝试调用 prefixMatched 来检查信用卡号是否符合要求;如果数字 d 是数字的前缀。但是,我从编译器返回的唯一信息是:

"CreditCardValidation.java:6: integer number too large: 4388576018402626
        System.out.print(prefixMatched(4388576018402626, 4388));


                               ^"

如果我的问题过于笼统,我很抱歉,这是我的第一篇文章。

【问题讨论】:

  • 你试过写4388576018402626L
  • 值得补充的是,您使用数字来存储信用卡“号码”,您不会加减乘除信用卡号码,因此它不是数字,它是“单词”;所以将其存储为字符串

标签: java methods static-methods credit-card


【解决方案1】:
  1. 您需要向编译器表明您的常量(CC 编号)是长的。在常量的末尾放一个 L
  2. 实际上将 CC 数字视为字符串并使用 charAt(x) 计算校验位要容易一些。

【讨论】:

    【解决方案2】:

    问题是您指定了一个整数文字 4388576018402626 并且该数字大于 the maximum integer, 2147483647

    您正试图将其传递给采用long 的方法,因此通过附加L 使其成为long 文字:

    System.out.print(prefixMatched(4388576018402626L, 4388));
    

    JLS specifies this behavior in Section 3.10.1:

    如果整数文字以 ASCII 字母 L 或 l (ell) 为后缀,则它是 long 类型;否则它是 int 类型(§4.2.1)。

    如果 int 类型的十进制文字大于 2147483648 (231),或者如果十进制文字 2147483648 出现在除一元减号的操作数之外的任何位置,则这是编译时错误运算符(第 15.15.4 节)。

    【讨论】:

    • 我明白了,谢谢。如果我可以问你另一个问题,为什么我提供的数字和 d 的结果是假的,尽管它应该是真的?
    • 这是另一个与整数太大有关的错误。您从getSize 获得长度为 16。您的f 变量因此是16 - 412Math.pow(10, f) 的结果是 10^12,它太大而无法放入 int。转换为int 会导致溢出和不正确的prefix。将Math.pow(10, f) 的结果转换为long 而不是int,您将得到正确的结果。
    • 我很感激。你能看到我在这里做错了吗?我试图通过这样做来对卡号中的所有其他数字求和:/* 返回奇数位数字的总和。 */ public static int sumOfoddPlace(long number) { int maxDigitLength = 16;整数总和 = 0; for (int i = 1; i
    【解决方案3】:

    在文字末尾添加L

    4388576018402626L
    

    【讨论】:

      【解决方案4】:

      你应该使用Long 而不是Integer

      int: 默认情况下,int 数据类型为 32 位有符号二进制补码整数,最小值为 -231,最大值为 231-1。在 Java SE 8 及更高版本中,您可以使用 int 数据类型来表示一个无符号的 32 位整数,其最小值为 0,最大值为 232-1。使用 Integer 类将 int 数据类型用作无符号整数。已将 compareUnsigneddivideUnsigned 等静态方法添加到 Integer 类中,以支持无符号整数的算术运算。

      long: long 数据类型是 64 位二进制补码整数。有符号长整数的最小值为 -263,最大值为 263-1。在 Java SE 8 及更高版本中,您可以使用 long 数据类型来表示无符号的 64 位 long,其最小值为 0,最大值为 264-1。 unsigned long 的最小值为 0,最大值为 264-1。当您需要比 int 提供的值范围更广的值时,请使用此数据类型。 Long 类还包含 compareUnsigneddivideUnsigned 等方法,以支持 unsigned long 的算术运算。

      你应该使用以下来避免exception:

      System.out.print(prefixMatched(4388576018402626L, 4388));
      

      L 表示给定值为long。您可以使用lL,但我更喜欢使用L,因为它看起来很好看代码。

      来源: Oracle 文档。

      【讨论】:

      • why do I get the result as false for the number:因为java编译器认为integer直到和除非附加l 小写lUPPER-CASE L 在给定数字的右侧。
      【解决方案5】:

      对于这段代码,我建议使用String 而不是处理longint。尝试匹配前四位数字时要容易得多,可以使用String#substring 轻松隔离:(String_name).substring(0,4) 将返回字符串的前四位数字。然后可以使用Integer#parseInt 将其解析为int,或者简单地与另一个String 进行比较(如果前缀也是String)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-23
        • 2011-01-25
        • 1970-01-01
        • 2020-06-17
        • 1970-01-01
        • 2012-12-15
        相关资源
        最近更新 更多