编译错误,整数太大。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文档
对于这段代码,我建议使用
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
小写或大写。