【问题标题】:What variable type can I use to hold huge numbers (30+ digits) in java?我可以使用什么变量类型来保存 Java 中的大量数字(30 位以上)?
【发布时间】:2013-08-26 12:40:19
【问题描述】:

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

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

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

编辑

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

【问题讨论】:

    标签: java biginteger bigdecimal


    【解决方案1】:

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

    【讨论】:

    • 你知道BigInteger的最大值是多少吗?
    • @Jon:可能高于 2^1000000。真的,取决于你有多少内存。
    • @Jon 这是(2^32)^(2^31-1)
    • 我可以用吗? BigInteger testData = Math.random() * LIMIT + 1;??
    • @rootTraveller 你必须了解不同类型、原语与对象等之间的区别。如果你想随机化,看看这些答案:stackoverflow.com/questions/8244691/…stackoverflow.com/questions/2290057/…
    【解决方案2】:

    您可以尝试使用 BigInteger 类来处理非常大的整数。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        你可以使用浮动^e

        所以你可以拥有

        0.55342663552772737682136182736127836782163 * 10^e
        

        计算器也大多使用它。

        【讨论】:

        • 浮点数只有大约 8 位小数的精度。您可能应该避免使用它。
        • (docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3) 浮点类型是 float 和 double,它们在概念上与指定的单精度 32 位和双精度 64 位格式 IEEE 754 值和操作相关联在 IEEE 二进制浮点算术标准,ANSI/IEEE 标准 754-1985(IEEE,纽约)中。
        • 你知道32位意味着尾数只有23位吗?而 23 位只能表示 7-8 位的数字,对吧?
        【解决方案5】:

        这适用于所有大于 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));
                }
            }
        

        【讨论】:

        • 虽然代码很受欢迎,但它应该始终有一个附带的解释。这不必很长,但在意料之中。
        • 这适用于所有大于 15 的数字,因为使用 int 会破坏它。您可能希望找到 50 或 100 0r 500 的阶乘。这很有效。
        • 公共类阶乘 { BigInteger fatFactorial(int b) { if (BigInteger.ONE.equals(BigInteger.valueOf(b)) || BigInteger.ZERO.equals(BigInteger.valueOf(b))) { 返回 BigInteger.ONE; } else { return BigInteger.valueOf(b).multiply(fatFactorial(b - 1)); } } public static void main(String[] args) { Factorial fac = new Factorial(); System.out.println("" + 500 + " = " + fac.fatFactorial(500)) 的脂肪数事实; } }
        • 不,不!将其编辑为您的答案。这个解释不是给我的,它是给未来的谷歌人(和java初学者)的。
        • 不,你不需要包括整个班级,它不会让事情更清楚。您的原始代码 sn-p 就足够了,但请解释一下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        相关资源
        最近更新 更多