编译错误,整数太大。 CreditCardAnalysis.Java

时间:2013-10-28 16:06:02

标签: java methods static-methods credit-card

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

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));


                               ^"

对不起,如果我的问题太过分了,这是我的第一篇文章。

5 个答案:

答案 0 :(得分:1)

  1. 您需要向编译器指出您的常量(CC编号)很长。在常量的末尾添加 L
  2. 将CC编号作为字符串处理并使用charAt(x)计算校验位数实际上要容易一些。

答案 1 :(得分:0)

在文字的末尾添加L

4388576018402626L

答案 2 :(得分:0)

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

您正在尝试将其传递给采用long的方法,因此请通过附加long将其设为L字面值:

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(2 31 ),或者十进制文字2147483648出现在除一元的操作数以外的任何地方,则为编译时错误运算符(第15.15.4节)。

答案 3 :(得分:0)

您应该使用Long代替Integer

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

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

您应该使用以下内容来避免exception

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

L表示给定值为long。您可以使用lL,但我更喜欢使用L,因为它在查看代码时看起来像货物。

来源: Oracle文档。

答案 4 :(得分:0)

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