Большие числа в Java

95

Как я могу выполнять вычисления с очень большими числами на Java?

Я пробовал, longно он достигает максимума 9223372036854775807, а при использовании целого числа он не сохраняет достаточно цифр и, следовательно, недостаточно точен для того, что мне нужно.

Есть ли что-нибудь вокруг этого?

Пити Б.
источник
3
9223372036854775807в Long.MAX_VALUEлюбом случае является точным значением .
Джин Квон

Ответы:

154

Вы можете использовать BigIntegerкласс для целых чисел и BigDecimalдля чисел с десятичными цифрами. Оба класса определены в java.mathpackage.

Пример:

BigInteger reallyBig = new BigInteger("1234567890123456890");
BigInteger notSoBig = new BigInteger("2743561234");
reallyBig = reallyBig.add(notSoBig);
Фабио Винисиус Биндер
источник
8
Возможно, стоит упомянуть (хотя и очевидно для большинства) снижение производительности при наследовании, вызванное использованием класса BigInteger, если вы планируете проводить с ним вычисления.
haylem
@haylem скорость работы такая же, но длина числа требует времени. они используют поразрядные операторы для выполнения вычислений. как то, что обычно происходит при математических вычислениях с примитивными типами.
Eboubaker
18

Вот пример, который очень быстро получает большие числа.

import java.math.BigInteger;

/*
250000th fib # is: 36356117010939561826426 .... 10243516470957309231046875
Time to compute: 3.5 seconds.
1000000th fib # is: 1953282128707757731632 .... 93411568996526838242546875
Time to compute: 58.1 seconds.
*/
public class Main {
    public static void main(String... args) {
        int place = args.length > 0 ? Integer.parseInt(args[0]) : 250 * 1000;
        long start = System.nanoTime();
        BigInteger fibNumber = fib(place);
        long time = System.nanoTime() - start;

        System.out.println(place + "th fib # is: " + fibNumber);
        System.out.printf("Time to compute: %5.1f seconds.%n", time / 1.0e9);
    }

    private static BigInteger fib(int place) {
        BigInteger a = new BigInteger("0");
        BigInteger b = new BigInteger("1");
        while (place-- > 1) {
            BigInteger t = b;
            b = a.add(b);
            a = t;
        }
        return b;
    }
}
Питер Лоури
источник
1
Для действительно больших чисел Фибоначчи рекурсивное вычисление занимает до смешного много времени. Намного лучше использовать явную формулу Бине . Несколько позже Math.pow () и Math.sqrt () - готово! :)
Зубин Мукерджи
2
@ZubinMukerjee, однако pow и sqrt на BigDecimal тоже не из дешевых. Это лучше, чем повторение, но не так просто, как кажется.
Питер Лоури
13

Касса BigDecimalи BigInteger.

Клинт Миллер
источник
6
import java.math.BigInteger;
import java.util.*;
class A
{
    public static void main(String args[])
    {
        Scanner in=new Scanner(System.in);
        System.out.print("Enter The First Number= ");
        String a=in.next();
        System.out.print("Enter The Second Number= ");
        String b=in.next();

        BigInteger obj=new BigInteger(a);
        BigInteger obj1=new BigInteger(b);
        System.out.println("Sum="+obj.add(obj1));
    }
}
Рупендра Шарма
источник
3

В зависимости от того, что вы делаете, вам может быть интересно взглянуть на GMP (gmplib.org), который представляет собой высокопроизводительную библиотеку с высокой точностью. Чтобы использовать его в Java, вам нужны оболочки JNI для двоичной библиотеки.

См. Часть кода Alioth Shootout для примера использования его вместо BigInteger для вычисления числа Пи с произвольным числом цифр.

https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-java-2.html

Тревор Типпинс
источник