Java中的大量数字


93

我将如何使用Java中的超大型数进行计算?

我已经尝试过了,long但是最大值达到了9223372036854754775807,当使用整数时,它不能保存足够的数字,因此对于我所需要的来说不够准确。

有没有办法解决?


3
9223372036854775807是的确切值Long.MAX_VALUE
金权

Answers:


153

您可以将BigInteger类用于整数和BigDecimal具有十进制数字的数字。这两个类都在java.math包中定义。

例:

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

8
如果您打算使用BigInteger类进行计算,那么可能值得一提的是(虽然对大多数人来说这很明显),但它继承了使用BigInteger类所引起的性能下降。
haylem 2012年

@haylem的性能速度是相同的,但是数字的长度使它花费时间。他们使用按位运算符进行计算。像使用原始类型进行数学运算时通常会发生的情况。
ZOLDIK


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
对于真正大的斐波那契数,递归计算非常耗时。使用Binet的显式公式会更好。几个Math.pow()和Math.sqrt()之后,您就完成了!:)
Zubin Mukerjee

1
@ZubinMukerjee但是BigDecimal上的pow和sqrt也不便宜。它比迭代好,但听起来并不简单。
彼得·劳瑞


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.