Я пытаюсь сделать программу, которая преобразует значения в биты. Все работало хорошо, пока я не добрался до 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 бит.
Было бы неплохо использовать BigInteger
во всех ваших расчетах. Таким образом, вы не рискуете переполнением при умножении этих чисел.
BigInteger bigAns = BigInteger.valueOf(number).multiply(BigInteger.valueOf(8))
.multiply(BigInteger.valueOf(1000000000L));
Вы получаете отрицательное число, потому что вы превышаете максимально возможное значение для подписанного 32-битного целого и вызывают переполнение.
Когда вы имеете дело с такими большими цифрами, вы должны использовать long
вместо этого, который способен удерживать гораздо большие числа.
Чтобы реализовать это, измените int ans = number * 8 * 1000000000
на long ans = number * 8 * 1000000000l
Сначала преобразуйте в biginteger, затем выполните вычисления.
BigInteger.valueOf(number * 8 * 1000000000);
Здесь вы выполняете вычисления в int, а затем конвертируете в BigInteger, когда будет слишком поздно.
Используйте BigInteger.valueOf (число), затем вызовите соответствующие методы для выполнения ваших вычислений.
Ответ, который вы получаете, - это стоимость мусора. Вы можете преобразовать int в BigInteger, сделав так:
BigInteger bi = BigInteger.valueOf(myInteger.intValue());
И как сказал Бошулав:
Вы можете использовать этот номер * 8 * 1000000000l, чтобы предотвратить переполнение.
Помог? Дай мне знать :)