web-dev-qa-db-ja.com

Javaで巨大な数字(30桁以上)を保持するために、どの変数タイプを使用できますか?

Javaで巨大な数字(最大40桁まで)を保存するのに使用できる本当に大きな変数型はありますか?

longの最大値は9223372036854775807で、これは19桁で、十分な大きさではありません。

私は現在、ほとんどの場合10桁程度しか保持できないため、大きな数を処理できる計算機を作成しようとしていますが、はるかに大きな数の正確な計算が必要です

[〜#〜] edit [〜#〜]

答えてくれてありがとう。大きな整数にはBigIntegerを使用できますが、唯一の制限はコンピューターのメモリです(十分なはずです)。小数の場合、@ WebDaldoが示唆したfloat ^ e、または@kockoが示唆したBigDecimal(BigIntegerに類似)を使用します。

18
Jonathan Lam

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

28
Sajal Dutta

本当に巨大な整数を扱う操作には BigInteger クラスを使用してみてください。

浮動小数点数を使用する操作の場合、Javaは BigDecimal クラスを提供します。これは同様に便利です。

12

電卓で使用するような指数を使用した計算では、BigDecimalを使用する必要があります。 BigIntegerの問題は、整数(小数ではない)のみを処理し、10 ^ 100のような非常に大きな数値では、科学に基づく形式を使用する代わりに、多くのメモリを使用してすべてのゼロを格納することです表記法。

代わりに、浮動小数点数型doubleを使用することもできます。これにより、値の範囲が広くなり、メモリの使用量が少なくなり、操作が高速になります。ただし、丸めの問題と精度の制限(10進数で約16桁)があるため、何をしているのか本当に理解していない限り、使用することはお勧めしません。

4
Joni

Float ^ eを使用できます

だからあなたが持つことができる

0.55342663552772737682136182736127836782163 * 10^e

電卓もほとんどそれを使用しています。

2
JavaDM

これは、intを使用すると問題が発生するため、15を超えるすべての大きな数値に対応しています。 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));
        }
    }
1
kamals1986