Я пытаюсь конвертировать int в BigInteger, может кто-нибудь мне помочь?

1

Я пытаюсь сделать программу, которая преобразует значения в биты. Все работало хорошо, пока я не добрался до GB (гигабайт). Так, например, 1 ГБ должен равняться 8 миллиардам бит, но результат дает мне отрицательный ответ. Вот мой код может кто-нибудь дать мне некоторое представление?

else if(line.equals("GB")) {
        Scanner num = new Scanner(System.in);
        System.out.println("How many GigaBytes are you transfering to bits?");
        int number = num.nextInt();
        //int ans = number * 8 * 1000000000;
        BigInteger bigAns = BigInteger.valueOf(number * 8 * 1000000000);
        System.out.println(number + " GigaByte(s) equals " + bigAns + " bits.");
    }

Вот результат, который я получаю: 1 GigaByte (s) равен -589934592 бит.

  • 0
    Угадайте, что приводит к int 2 других целых.
Теги:

4 ответа

4
Лучший ответ

Было бы неплохо использовать BigInteger во всех ваших расчетах. Таким образом, вы не рискуете переполнением при умножении этих чисел.

BigInteger bigAns = BigInteger.valueOf(number).multiply(BigInteger.valueOf(8))
                              .multiply(BigInteger.valueOf(1000000000L));
  • 0
    Это сработало отлично! Спасибо Макото
2

Вы получаете отрицательное число, потому что вы превышаете максимально возможное значение для подписанного 32-битного целого и вызывают переполнение.

Когда вы имеете дело с такими большими цифрами, вы должны использовать long вместо этого, который способен удерживать гораздо большие числа.

Чтобы реализовать это, измените int ans = number * 8 * 1000000000 на long ans = number * 8 * 1000000000l

  • 1
    Да, это правда. И если вместо записи 8 * 1000000000 вы напишите 8000000000, вы увидите, что ваш компилятор отклоняет ваш номер.
0

Сначала преобразуйте в biginteger, затем выполните вычисления.

BigInteger.valueOf(number * 8 * 1000000000);

Здесь вы выполняете вычисления в int, а затем конвертируете в BigInteger, когда будет слишком поздно.

Используйте BigInteger.valueOf (число), затем вызовите соответствующие методы для выполнения ваших вычислений.

0

Ответ, который вы получаете, - это стоимость мусора. Вы можете преобразовать int в BigInteger, сделав так:

BigInteger bi = BigInteger.valueOf(myInteger.intValue());

И как сказал Бошулав:

Вы можете использовать этот номер * 8 * 1000000000l, чтобы предотвратить переполнение.

Помог? Дай мне знать :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню