Какой тип переменной я могу использовать для хранения огромных чисел (30+ цифр) в java?

есть ли действительно большой тип переменной, который я могу использовать в Java для хранения огромных чисел (до сорока цифр)?

longмаксимальное значение-9223372036854775807, что составляет 19 цифр-недостаточно большой.

Я пытаюсь создать калькулятор, который может обрабатывать большие числа, потому что большинство в настоящее время может содержать только недостаточные 10 цифр или около того, и я хочу, чтобы точные вычисления с номерами намного больше величина

редактировать

Спасибо за ответы. Я могу использовать BigInteger для больших целых чисел единственным ограничением является память компьютера (должно быть достаточно). Для десятичных знаков я буду использовать float ^e, как предложил @WebDaldo, или BigDecimal (подобно BigInteger), как предложил @kocko.

5 ответов


можно использовать 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, что отлично подходит для расчета суммы сравнить с двойной.

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


вы можете попробовать использовать BigInteger класс для работы с очень большими числами целыми.

для операций с плавающими числами Java предоставляет BigDecimal класс, который также может быть полезен.


для расчетов с показателями, как вы бы использовали в калькуляторе, вы должны использовать BigDecimal. Проблема с BigInteger это то, что он обрабатывает только целые числа (без дробных чисел), и что для действительно больших чисел, таких как 10^100, он хранит все нули, используя много памяти, вместо использования формата, основанного на научной нотации.

вы можете использовать числа с плавающей точкой типа double, что дает вам большой диапазон значений, низкое использование памяти и быстрый оперативный. Но из-за проблем округления и ограниченной точности (около 16 десятичных цифр) я бы не рекомендовал использовать его, если вы действительно не знаете, что делаете.


вы можете использовать float ^e

таким образом, вы могли бы

0.55342663552772737682136182736127836782163 * 10^e

калькуляторы в основном используют это тоже.


Это для всех больших чисел выше 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));
        }
    }