Jumlah Besar di Jawa

93

Bagaimana saya melakukan penghitungan dengan angka yang sangat besar di Jawa?

Saya telah mencoba longtetapi itu maksimal di 9223372036854775807, dan ketika menggunakan integer itu tidak menyimpan cukup angka dan karena itu tidak cukup akurat untuk apa yang saya butuhkan.

Apakah ada juga di sekitar ini?

Petey B
sumber
3
9223372036854775807adalah nilai persisnya Long.MAX_VALUE.
Jin Kwon

Jawaban:

153

Anda dapat menggunakan BigIntegerkelas untuk bilangan bulat dan BigDecimalangka dengan digit desimal. Kedua kelas tersebut didefinisikan dalam java.mathpaket.

Contoh:

BigInteger reallyBig = new BigInteger("1234567890123456890");
BigInteger notSoBig = new BigInteger("2743561234");
reallyBig = reallyBig.add(notSoBig);
Fabio Vinicius Binder
sumber
8
Mungkin layak menyebutkan (meskipun jelas untuk sebagian besar, saya kira) mewarisi hit kinerja yang ditimbulkan oleh penggunaan kelas BigInteger jika Anda berencana untuk melakukan perhitungan dengan itu.
haylem
@haylem kecepatan performanya sama tapi panjangnya angka membuatnya butuh waktu. mereka menggunakan operator bitwise untuk melakukan penghitungan. seperti yang biasanya terjadi saat mengerjakan matematika dengan tipe primitif.
ZOLDIK
18

Berikut adalah contoh yang mendapatkan angka besar dengan sangat cepat.

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;
    }
}
Peter Lawrey
sumber
1
Untuk angka Fibonacci yang sangat besar, kalkulasi rekursif sangat memakan waktu. Jauh lebih baik menggunakan rumus eksplisit Binet . Beberapa Math.pow () s dan Math.sqrt () nanti, Anda sudah selesai! :)
Zubin Mukerjee
1
@ZubinMukerjee Namun pow dan sqrt di BigDecimal juga tidak murah. Ini lebih baik daripada iterasi tetapi tidak sesederhana kedengarannya.
Peter Lawrey
13

Checkout BigDecimaldan BigInteger.

Clint Miller
sumber
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));
    }
}
Rupendra Sharma
sumber
3

Bergantung pada apa yang Anda lakukan, Anda mungkin ingin melihat GMP (gmplib.org) yang merupakan pustaka multi-presisi berkinerja tinggi. Untuk menggunakannya di Java, Anda memerlukan pembungkus JNI di sekitar pustaka biner.

Lihat beberapa kode Alioth Shootout untuk contoh penggunaannya alih-alih BigInteger untuk menghitung Pi ke sejumlah digit acak.

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

Trevor Tippins
sumber