为什么这个BigInteger在输入FFFFFFFF时显示不正确的结果(8楼)
Why does this BigInteger display incorrect results when entering FFFFFFFF (8 F)
我想用这段代码实现十六进制转十进制。当我输入FFFFFFFF(8F)时,它显示2415919102.However,4294967295是正确的。当我输入 F 或 F 或 FFF...FFFFFFF(7F) 时,它表现良好。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String t = in.next();
in.close();
BigInteger bi = new BigInteger("0");
int j = 0;
for(int i=t.length()-1;i>=0;i--,j++) {
char c = t.charAt(i);
double val = Integer.valueOf(c+"",16);
val = val*Math.pow(16, j);
BigInteger bi2 = new BigInteger((int)val+"");
bi = bi.add(bi2);
}
System.out.println(bi.toString());
}
正如救世主在中所说:
BigInteger bi = new BigInteger(t, 16);
4294967295
哪里出了问题?
您在这一行中溢出了 int
:
BigInteger bi2 = new BigInteger((int)val+"");
当处理前导F
的8位十六进制数时,你的double
是4.02653184E9或4026531840.0,但被转换为最大可能的int
值,这只是2147483647。因此,您的代码适用于 int
到 7FFFFFFF
范围内的字符串,但除此之外给出的结果不正确。
我想用这段代码实现十六进制转十进制。当我输入FFFFFFFF(8F)时,它显示2415919102.However,4294967295是正确的。当我输入 F 或 F 或 FFF...FFFFFFF(7F) 时,它表现良好。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String t = in.next();
in.close();
BigInteger bi = new BigInteger("0");
int j = 0;
for(int i=t.length()-1;i>=0;i--,j++) {
char c = t.charAt(i);
double val = Integer.valueOf(c+"",16);
val = val*Math.pow(16, j);
BigInteger bi2 = new BigInteger((int)val+"");
bi = bi.add(bi2);
}
System.out.println(bi.toString());
}
正如救世主在
BigInteger bi = new BigInteger(t, 16);
4294967295
哪里出了问题?
您在这一行中溢出了 int
:
BigInteger bi2 = new BigInteger((int)val+"");
当处理前导F
的8位十六进制数时,你的double
是4.02653184E9或4026531840.0,但被转换为最大可能的int
值,这只是2147483647。因此,您的代码适用于 int
到 7FFFFFFF
范围内的字符串,但除此之外给出的结果不正确。