我正在努力弄清楚代码中的编译/语法错误。
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));
^"
对不起,如果我的问题太过分了,这是我的第一篇文章。
答案 0 :(得分:1)
答案 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数据类型用作无符号整数。像compareUnsigned
,divideUnsigned
等静态方法已添加到Integer类中,以支持无符号整数的算术运算。
long: long
数据类型是64位二进制补码整数。带符号的long的最小值为-263,最大值为263-1。在Java SE 8及更高版本中,您可以使用长数据类型来表示无符号的64位长,其最小值为0,最大值为264-1。 unsigned long的最小值为0,最大值为264-1。当需要比int提供的值更宽的值时,请使用此数据类型。 Long类还包含compareUnsigned
,divideUnsigned
等方法,以支持无符号长整数的算术运算。
您应该使用以下内容来避免exception
:
System.out.print(prefixMatched(4388576018402626L, 4388));
L
表示给定值为long
。您可以使用l
或L
,但我更喜欢使用L
,因为它在查看代码时看起来像货物。
来源: Oracle文档。
答案 4 :(得分:0)
对于此代码,我建议您使用String
而不是处理long
和int
。尝试匹配前四位数时要容易得多,可以使用String#substring轻松隔离:(String_name).substring(0,4)
将返回字符串的前四位数字。然后可以使用Integer#parseInt将其解析为int
,或者只与另一个String
进行比较(如果前缀也是String
)。