当前位置: 代码迷 >> java >> 为什么这个 BigInteger 在输入 FFFFFFFF 时显示不正确的结果 (8 F)
  详细解决方案

为什么这个 BigInteger 在输入 FFFFFFFF 时显示不正确的结果 (8 F)

热度:116   发布时间:2023-07-31 13:42:58.0

我想用这段代码实现十六进制转十进制。 当我输入 FFFFFFFF(8F) 时,它显示 2415919102。但是,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());
}

正如 Savior 在所说:

    BigInteger bi = new BigInteger(t, 16);

4294967295

什么地方出了错?

您在这一行中溢出了一个int

        BigInteger bi2 = new BigInteger((int)val+"");

处理 8 位十六进制数中的前导F时,您的double精度值为 4.02653184E9 或 4026531840.0,但会转换为可能的最大int值,即仅为 2147483647。因此,您的代码适用于适合int字符串,最高为7FFFFFFF ,但除此之外给出了不正确的结果。

  相关解决方案