20

我可以在 Java 中使用一个非常大的变量类型来存储大量数字(最多大约 40 位数字)吗?

long的最大值是 9223372036854775807,即 19 位数字——不够大。

我正在尝试创建一个可以处理大量数字的计算器,因为现在大多数数字只能容纳不足 10 位左右,我想要精确计算更大数量的数字

编辑

感谢您的回答。我可以BigInteger用于大整数,唯一的限制是计算机的内存(应该足够了)。对于小数,我将使用float^e,正如 @WebDaldo 所建议的那样,或者BigDecimal(类似于 BigInteger),正如 @kocko 所建议的那样。

4

5 回答 5

33

您可以使用BigInteger类。

BigInteger bi1 = new BigInteger("637824629384623845238423545642384"); 
BigInteger bi2 = new BigInteger("3039768898793547264523745379249934"); 

BigInteger bigSum = bi1.add(bi2);
        
BigInteger bigProduct = bi1.multiply(bi2);
       
System.out.println("Sum : " + bigSum);
System.out.println("Product : " + bigProduct);

输出:

总和:3677593528178171109762168924892318

产品 : 1938839471287900434078965247064711159607977007048190357000119602656

我应该提到BigDecimal ,与double相比,它非常适合金额计算。

BigDecimal bd = new BigDecimal("123234545.4767");
BigDecimal displayVal = bd.setScale(2, RoundingMode.HALF_EVEN);

NumberFormat usdFormat = NumberFormat.getCurrencyInstance(Locale.US);        
System.out.println(usdFormat.format(displayVal.doubleValue()));

输出:

123,234,545.48 美元

于 2013-08-26T12:41:58.333 回答
12

您可以尝试将BigInteger类用于具有非常大的整数的操作。

对于浮点数的运算,Java 提供了BigDecimal类,它也很有用。

于 2013-08-26T12:41:09.853 回答
4

对于指数计算,就像您在计算器中使用的那样,您应该使用BigDecimal. 问题BigInteger在于它只处理整数(没有小数),并且对于像 10^100 这样的非常大的数字,它使用大量内存存储所有零,而不是使用基于科学记数法的格式。

您也可以使用浮点数类型double,它为您提供大范围的值、低内存使用和快速操作。但是由于舍入问题和有限的精度(大约 16 位十进制数字),除非您真的知道自己在做什么,否则我不建议您使用它。

于 2013-08-26T12:49:21.867 回答
2

您可以使用浮动 ^e

所以你可以有

0.55342663552772737682136182736127836782163 * 10^e

计算器也大多使用它。

于 2013-08-26T12:46:33.413 回答
1

这适用于所有大于 15 的数字,因为使用 int 会破坏它。您可能希望找到 50 或 100 0r 500 的阶乘。

// Recursive version of the Fat factorial for bigger numbers ex: Factorial of 500     
BigInteger fatFactorial(int b) {
    if (BigInteger.ONE.equals(BigInteger.valueOf(b))
        || BigInteger.ZERO.equals(BigInteger.valueOf(b))) {
            return BigInteger.ONE;
    } else {
        return BigInteger.valueOf(b).multiply(fatFactorial(b - 1));
        }
    }
于 2015-05-17T05:27:52.993 回答