Какой тип переменной можно использовать для хранения огромных чисел (30 + цифр) в java?
Есть ли действительно большой тип переменной, который я могу использовать в Java для хранения огромных чисел (до сорока цифр)?
long
максимальное значение - 9223372036854775807, что составляет 19 цифр - не достаточно большое.
Я пытаюсь создать калькулятор, который может обрабатывать большие числа, потому что в большинстве случаев в наши дни может храниться недостаточно 10 цифр или около того, и я хочу получить точные вычисления с номерами гораздо большей величины
ИЗМЕНИТЬ
Спасибо за ответы. Я могу использовать BigInteger
для больших целых чисел, единственным ограничением является память компьютера (должно быть достаточно). Для десятичных знаков я буду использовать float
^ e, как предложил @WebDaldo, или BigDecimal
(аналогично BigInteger), как предположил @kocko.
Ответы
Ответ 1
Вы можете использовать BigInteger класс.
BigInteger bi1 = new BigInteger("637824629384623845238423545642384");
BigInteger bi2 = new BigInteger("3039768898793547264523745379249934");
BigInteger bigSum = bi1.add(bi2);
BigInteger bigProduct = bi1.multiply(bi2);
System.out.println("Sum : " + bigSum);
System.out.println("Product : " + bigProduct);
Вывод:
Сумма: 3677593528178171109762168924892318
Продукт: 1938839471287900434078965247064711159607977007048190357000119602656
Я должен упомянуть BigDecimal, что отлично подходит для вычислений суммы, сравнимых с double.
BigDecimal bd = new BigDecimal("123234545.4767");
BigDecimal displayVal = bd.setScale(2, RoundingMode.HALF_EVEN);
NumberFormat usdFormat = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println(usdFormat.format(displayVal.doubleValue()));
Вывод:
$123,234,545.48
Ответ 2
Вы можете попробовать использовать класс BigInteger для операций с действительно огромными целыми числами.
Для операций с плавающими числами Java предоставляет класс BigDecimal, который также может быть полезен.
Ответ 3
Для расчетов с показателями, как и в калькуляторе, вы должны использовать BigDecimal
. Проблема с BigInteger
заключается в том, что он обрабатывает только целые числа (без дробных чисел) и что для действительно больших чисел, таких как 10 ^ 100, он сохраняет все нули, используя большую память, вместо использования формата, основанного на научной нотации.
В качестве альтернативы вы можете использовать тип числа с плавающей запятой double
, который дает вам большой диапазон значений, низкое использование памяти и быстрые операции. Но из-за проблем округления и ограниченной точности (около 16 десятичных цифр) я бы не рекомендовал использовать его, если вы действительно не знаете, что делаете.
Ответ 4
Вы можете использовать float ^ e
чтобы вы могли
0.55342663552772737682136182736127836782163 * 10^e
В основном используются калькуляторы.
Ответ 5
Это для всех больших чисел выше 15, так как использование int ударяет его. Вы можете найти факториал 50 или 100 0r 500.
// Recursive version of the Fat factorial for bigger numbers ex: Factorial of 500
BigInteger fatFactorial(int b) {
if (BigInteger.ONE.equals(BigInteger.valueOf(b))
|| BigInteger.ZERO.equals(BigInteger.valueOf(b))) {
return BigInteger.ONE;
} else {
return BigInteger.valueOf(b).multiply(fatFactorial(b - 1));
}
}