Số lớn trong Java


93

Làm cách nào để thực hiện các phép tính với các số cực lớn trong Java?

Tôi đã thử longnhưng con số đó tối đa là 9223372036854775807 và khi sử dụng số nguyên, nó không lưu đủ chữ số và do đó không đủ chính xác cho những gì tôi cần.

Có cách nào để khắc phục điều này?


3
9223372036854775807là giá trị chính xác của Long.MAX_VALUE, dù sao.
Jin Kwon

Câu trả lời:


153

Bạn có thể sử dụng BigIntegerlớp cho số nguyên và BigDecimalcho các số có chữ số thập phân. Cả hai lớp đều được định nghĩa trong java.mathgói.

Thí dụ:

BigInteger reallyBig = new BigInteger("1234567890123456890");
BigInteger notSoBig = new BigInteger("2743561234");
reallyBig = reallyBig.add(notSoBig);

8
Có thể đáng đề cập đến (mặc dù rõ ràng đối với hầu hết, tôi đoán) lần truy cập hiệu suất kế thừa phát sinh bởi việc sử dụng lớp BigInteger nếu bạn định thực hiện các phép tính với nó.
haylem

@haylem tốc độ thực hiện như nhau nhưng độ dài của con số làm mất thời gian. họ sử dụng toán tử bitwise để thực hiện các phép tính. như những gì xảy ra bình thường khi làm toán với các kiểu nguyên thủy.
ZOLDIK


18

Đây là một ví dụ nhận được những con số lớn rất nhanh chóng.

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
Đối với các số Fibonacci thực sự lớn, việc tính toán đệ quy tốn thời gian một cách kỳ lạ. Tốt hơn nhiều nếu sử dụng công thức rõ ràng của Binet . Sau đó một vài Math.pow () s và Math.sqrt (), bạn đã hoàn tất! :)
Zubin Mukerjee

1
@ZubinMukerjee tuy nhiên pow và sqrt trên BigDecimal cũng không rẻ. Nó tốt hơn sự lặp lại nhưng không đơn giản như nó nghe.
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));
    }
}

3

Tùy thuộc vào những gì bạn đang làm, bạn có thể muốn xem GMP (gmplib.org) là một thư viện đa độ chính xác hiệu suất cao. Để sử dụng nó trong Java, bạn cần các trình bao bọc JNI xung quanh thư viện nhị phân.

Hãy xem một số mã Alioth Shootout để biết ví dụ về việc sử dụng nó thay vì BigInteger để tính Pi cho một số chữ số tùy ý.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.