2013-08-26 10 views
13

Gibt es einen wirklich großen Variablentyp, den ich in Java verwenden kann, um große Zahlen (bis zu vierzig Ziffern) zu speichern?Welchen Variablentyp kann ich verwenden, um große Zahlen (30+ Ziffern) in Java zu speichern?

long ist der maximale Wert 9223372036854775807, die 19 Ziffern ist - nicht annähernd groß genug.

Ich versuche, einen Rechner zu erstellen, die eine große Zahl umgehen kann, weil die meisten heutzutage nur eine unzureichende 10 Stellen halten kann oder so, und ich möchte mit Zahlen von einem viel größeren Ausmaß genaue Berechnungen wollen

EDIT

Danke für die Antworten. Ich kann BigInteger für große Ganzzahlen verwenden, die einzige Grenze ist der Speicher des Computers (sollte ausreichen). Für Dezimalstellen verwende ich float^e, wie @WebDaldo vorgeschlagen, oder BigDecimal (ähnlich BigInteger), wie @kocko vorgeschlagen.

Antwort

19

Sie können BigInteger Klasse verwenden.

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); 

Ausgang:

Summe: 3677593528178171109762168924892318

Produkt: 1938839471287900434078965247064711159607977007048190357000119602656

Ich sollte BigDecimal erwähnen, das ist ausgezeichnet für Menge Berechnungen Doppel vergleichen.

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())); 

Ausgang:

$ 123,234,545.48

+0

wissen Sie, was der größte Wert von 'BigInteger' ist? –

+0

@Jon: Wahrscheinlich irgendwo über 2^1000000. Hängt davon ab, wie viel Speicher du wirklich hast. – cHao

+2

@Jon Es ist '(2^32)^(2^31-1)'. – arshajii

11

Sie können die BigInteger Klasse für Operationen mit sehr großen ganzen Zahlen versuchen.

Für Operationen mit Gleitkommazahlen bietet Java die Klasse BigDecimal, die ebenfalls nützlich sein kann.

2

können Sie verwenden float^e

so könnten Sie haben

0.55342663552772737682136182736127836782163 * 10^e 

Rechner sind meist t verwenden Hut auch.

+1

Ein Java 'float' ist keine willkürliche Genauigkeit ... –

+1

Ein Float hat nur etwa 8 Dezimalstellen Genauigkeit. Sie sollten es wahrscheinlich vermeiden, es zu benutzen. – Joni

+1

(http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3) Die Fließkommatypen sind Float und Double, die konzeptuell zugeordnet sind die 32-Bit- und Double-Precision-64-Bit-IEEE-754-Werte und -Operationen mit einfacher Genauigkeit, wie im IEEE-Standard für binäre Fließkomma-Arithmetik, ANSI/IEEE-Standard 754-1985 (IEEE, New York) festgelegt. – JavaDM

4

Für Berechnungen mit Exponenten, wie Sie sie in einem Taschenrechner verwenden würden, sollten Sie BigDecimal verwenden. Das Problem mit BigInteger ist, dass es nur ganze Zahlen (keine Bruchzahlen) handhabt und dass es für wirklich große Zahlen wie 10^100 alle Nullen speichert und viel Speicher verwendet, anstatt ein Format zu verwenden, das auf wissenschaftlicher Notation basiert.

Sie könnten auch die Fließkommazahl double verwenden, die Ihnen eine große Auswahl an Werten, geringen Speicherverbrauch und schnelle Operationen bietet.Aber wegen der Rundungsprobleme und der begrenzten Genauigkeit (ungefähr 16 Dezimalziffern) würde ich es nicht empfehlen, es zu verwenden, außer Sie wissen wirklich, was Sie tun.

1

Dies ist für alle größeren Zahlen über 15, da die Verwendung von Int es bläst. Vielleicht möchten Sie die Fakultät von 50 oder 100 oder 500 zu finden.

// 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

Obwohl der Code geschätzt wird, sollte er immer eine begleitende Erklärung enthalten. Dies muss nicht lange dauern, aber es wird erwartet. – peterh

+0

Dies ist für alle größeren Zahlen über 15, da die Verwendung von Int es bläst. Vielleicht möchten Sie den Faktor von 50 oder 100 oder 500 finden. Das funktioniert. – kamals1986

+0

public class Factorial { \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 zurück BigInteger.ONE; \t \t} else { \t \t \t return BigInteger.valueOf (b) .multiply (fatFactorial (b - 1)); \t \t} \t} \t public static void main (String [] args) { \t \t Factorial fac = new Factorial(); \t \t System.out.println ("Fat Numbers Fact von" + 500 + "=" \t \t \t \t + fac.fatFactorial (500)); \t} } – kamals1986