Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译错误,整数太大。CreditCardAnalysis.Java_Java_Methods_Static Methods_Credit Card - Fatal编程技术网

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

编译错误,整数太大。CreditCardAnalysis.Java,java,methods,static-methods,credit-card,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 g

我正在努力找出代码中的编译/语法错误

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


                               ^"

如果我的问题太夸张,我很抱歉,这是我的第一篇帖子。

在你的文字末尾添加
L

4388576018402626L

问题是您指定的是一个整数文本
4388576018402626
,该数字大于

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

System.out.print(prefixMatched(4388576018402626L, 4388));
委员会:

如果整型文字以ASCII字母L或L(ell)作为后缀,则其类型为long;否则为int型(§4.2.1)

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


您应该使用
Long
而不是
Integer

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

long:
long
数据类型是一个64位2的补码整数。有符号long的最小值为-263,最大值为263-1。在JavaSE8及更高版本中,可以使用long数据类型来表示无符号的64位long,其最小值为0,最大值为264-1。无符号long的最小值为0,最大值为264-1。当需要比int提供的值范围更宽的值时,请使用此数据类型。该类还包含
compareUnsigned
divideUnsigned
等方法,以支持无符号长字符的算术运算

您应该使用以下方法来避免异常:

System.out.print(prefixMatched(4388576018402626L, 4388));
L
表示给定值为
long
。您可以使用
l
l
,但我更喜欢使用
l
,因为它在查看代码的同时查看商品

来源:Oracle文档

  • 您需要向编译器指示常量(CC编号)是长的。在常数的末尾加一个L
  • 实际上,将CC数字视为字符串并使用charAt(x)来计算校验位更容易一些
    对于这段代码,我建议使用
    String
    而不是处理
    long
    int
    。在尝试匹配前四位数字时要容易得多,使用:
    (String\u name)可以很容易地隔离前四位数字。子字符串(0,4)
    将返回字符串的前四位数字。然后可以使用解析为
    int
    ,或者简单地与另一个
    String
    (如果前缀也是
    String
    )进行比较。

    您是否尝试过编写4388576018402626值得补充的是,您使用一个数字来存储信用卡“号码”,您不需要加、减、除或乘信用卡号码,所以它不是一个名词,而是一个“词”;所以,我明白了,把它当作细绳来保存,谢谢。如果我可以问你另一个问题,为什么我得到的结果是我提供的数字和d为假,虽然它应该是真的?这是另一个与整数太大有关的错误。您可以从
    getSize
    获得16的长度。因此,您的
    f
    变量是
    16-4
    ,或
    12
    Math.pow(10,f)
    的结果是
    10^12
    ,它太大,无法放入
    int
    中。转换为
    int
    会导致溢出和不正确的
    前缀。将
    Math.pow(10,f)
    的结果转换为
    long
    而不是
    int
    ,你会得到正确的结果。我很感激。你能看出我做错了什么吗?我尝试通过以下操作对卡号中的其他每一位数字求和:/*返回奇数位数字的总和。*/public static int sumOfoddPlace(长数字){int maxDigitLength=16;int sum=0;用于(int i=1;i
    为什么我会将数字的结果设为false
    :因为java编译器认为是
    整数
    ,除非在给定数字的右侧附加
    l
    小写或大写。