2013-08-26 3 views
13

Javaで巨大な数値(最大40桁まで)を格納するために使用できる、本当に大きな変数タイプはありますか?十分に近い大きさでない -Javaで巨大な数値(30桁以上)を保持するために使用できる変数の型は何ですか?

longの最大値は19桁である、9223372036854775807です。

最も最近でのみ不十分な10桁かそこらを保持することができますので、私は、大きな数を扱うことができる電卓を作成しようとしている、と私ははるかに大きい大きさ

EDITの番号の正確な計算をしたいしたいです答えを

感謝。大きな整数にはBigIntegerを使用できますが、唯一の制限はコンピュータのメモリです(十分なはずです)。小数は、@WebDaldoが提案するようにfloat^e、または@kockoが提案するようにBigDecimal(BigIntegerに似ています)を使用します。

答えて

19

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を、言及する必要があります。

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

+0

「BigInteger」の最大値は何ですか。 –

+0

@ジョン:おそらく2^1000000のどこかにあります。あなたがどれくらいの記憶を持っているかによって、実際には異なります。 – cHao

+2

@Jonそれは '(2^32)^(2^31-1)'です。 – arshajii

11

あなたは本当に巨大な整数で操作のためBigIntegerクラスを使用して試すことができます。浮動番号の操作について

、Java(登録商標)は、同様に、有用であり得るBigDecimalクラスを提供します。

2

あなたはとてもあなたが

0.55342663552772737682136182736127836782163 * 10^e 

電卓はほとんどトンを使用している可能性がありフロート^ E

を使用することができます帽子も。あなたは電卓で使用するように

+1

java 'float'は任意の精度ではありません... –

+1

浮動小数点数は約10桁の精度しかありません。あなたはたぶんそれを使わないでください。 – Joni

+1

(http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3) 浮動小数点型は浮動小数点型と倍精度型で、概念的にはANSI/IEEE標準754-1985(IEEE、ニューヨーク)で規定されている単精度32ビットおよび倍精度の64ビット形式のIEEE 754値および演算。 – JavaDM

4

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

あなたは、代わりにあなたの価値、低メモリ使用量と高速操作の大規模な範囲を与える浮動小数点数型のdoubleを、使用することができます。しかし、丸めの問題と限られた精度(10進数の16桁程度)のために、あなたが何をしているのか本当に分かっていなければ、使用しないことをお勧めします。

1

これは、intを使用すると15を超えるすべての数値に適用されます。 50または100 0の階乗を求めることができます。

// 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)); 
     } 
    } 
+4

コードは高く評価されていますが、それには常に説明が付いています。これは長い必要はありませんが、期待されています。 – peterh

+0

これは、intを使用すると15を超えるすべての大きな数値に適用されます。 50または100 0rの階乗を求めることができます。これは機能します。 – kamals1986

+0

パブリッククラス階乗{ \tのBigInteger fatFactorial(int型B){ \t \t IF(BigInteger.ONE.equals(BigInteger.valueOf(B)) \t \t \t \t || BigInteger.ZERO.equals(BigInteger.valueOf(B )))){ \t \t \t return BigInteger.ONE; \t \t} else { \t \t \t return BigInteger.valueOf(b).multiply(fatFactorial(b-1)); \t \t} \t} \tパブリック静的無効メイン(文字列[] args){ \t \t階乗FAC =新しい階乗()。 \t \tするSystem.out.println(+ 500 + "=" \t \t \t \t + fac.fatFactorial(500) "の脂肪番号ファクト")。 \t} } – kamals1986

関連する問題