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?


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);

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;
    }
}

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


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));
    }
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.