Почему этот BigInteger отображает неверные результаты при вводе FFFFFFFF (8 F) - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу использовать этот код для получения шестнадцатеричного или десятичного числа.Когда я ввожу 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());
}

1 Ответ

0 голосов
/ 14 февраля 2019

Как сказал Спаситель в комментарии :

    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, но дает неверные результаты за пределами этого.

...