我可以用什么变量类型来保存java中的大数(30+位)?

时间:2013-08-26 12:40:19

标签: java biginteger bigdecimal

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

long的最大值是9223372036854775807,这是19位数 - 不够大。

我正在尝试创建一个可以处理大数字的计算器,因为现在大多数只能容纳10位左右的数字,而且我希望得到数字幅度更大的精确计算

修改

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

5 个答案:

答案 0 :(得分:21)

您可以使用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

答案 1 :(得分:12)

您可以尝试使用BigInteger类进行具有非常大整数的操作。

对于具有浮点数的操作,Java提供了BigDecimal类,它也很有用。

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

你可以使用float ^ e

所以你可以

0.55342663552772737682136182736127836782163 * 10^e

计算器也主要用于此。

答案 4 :(得分: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));
        }
    }