0

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

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


                               ^"

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

4

5 回答 5

1
  1. 您需要向编译器表明您的常量(CC 编号)是长的。在常数的末尾加上一个L。
  2. 将 CC 数字视为字符串并使用 charAt(x) 计算校验位实际上要容易一些。
于 2013-10-28T16:09:37.810 回答
0

L在文字末尾添加:

4388576018402626L
于 2013-10-28T16:08:38.200 回答
0

问题是您正在指定一个整数文字4388576018402626,并且该数字大于最大整数,2147483647 .

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

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

JLS 在第 3.10.1 节中指定了此行为:

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

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

于 2013-10-28T16:08:45.653 回答
0

你应该使用Long而不是 Integer

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

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 文档。

于 2013-10-28T16:09:28.300 回答
0

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

于 2013-10-28T17:40:11.820 回答