ตัวเลขขนาดใหญ่ใน Java


95

ฉันจะคำนวณตัวเลขที่มีขนาดใหญ่มากใน Java ได้อย่างไร

ฉันได้ลองแล้วlongแต่จะมีค่าสูงสุดที่ 9223372036854775807 และเมื่อใช้จำนวนเต็มมันบันทึกตัวเลขไม่เพียงพอดังนั้นจึงไม่แม่นยำเพียงพอสำหรับสิ่งที่ฉันต้องการ

มีรอบนี้หรือไม่?


3
9223372036854775807คือค่าที่แน่นอนของLong.MAX_VALUEอย่างไรก็ตาม
Jin Kwon

คำตอบ:


155

คุณสามารถใช้BigIntegerคลาสสำหรับจำนวนเต็มและBigDecimalสำหรับตัวเลขที่มีหลักทศนิยม ทั้งสองคลาสถูกกำหนดไว้ในjava.mathแพ็คเกจ

ตัวอย่าง:

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
สำหรับตัวเลข Fibonacci ที่มีขนาดใหญ่มากการคำนวณซ้ำจะใช้เวลานานอย่างน่าขัน ที่ดีมากที่จะใช้สูตรอย่างชัดเจน Binet ของ Math.pow () s และ Math.sqrt () สองสามตัวในภายหลังเสร็จแล้ว! :)
Zubin Mukerjee

2
@ZubinMukerjee อย่างไรก็ตาม Pow และ sqrt บน BigDecimal ก็ไม่ถูกเช่นกัน มันดีกว่าการทำซ้ำ แต่ไม่ง่ายอย่างที่คิด
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

ขึ้นอยู่กับว่าคุณกำลังทำอะไรอยู่คุณอาจต้องการดู GMP (gmplib.org) ซึ่งเป็นไลบรารีที่มีความแม่นยำสูงประสิทธิภาพสูง หากต้องการใช้ใน Java คุณต้องมี JNI wrapper รอบ ๆ ไลบรารีไบนารี

ดูรหัส Alioth Shootout สำหรับตัวอย่างการใช้แทน BigInteger เพื่อคำนวณ Pi เป็นจำนวนหลักโดยพลการ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.