2013-08-26 17 views
13

C'è un tipo di variabile molto grande che posso usare in Java per memorizzare numeri enormi (fino a circa quaranta cifre)?Quale tipo di variabile posso utilizzare per contenere numeri enormi (più di 30 cifre) in java?

long 's valore massimo è 9223372036854775807, che è di 19 cifre - non abbastanza grande abbastanza.

Sto cercando di creare una calcolatrice in grado di gestire un gran numero, perché la maggior parte al giorno d'oggi può contenere solo un insufficiente 10 cifre o giù di lì, e voglio voglio calcoli accurati con i numeri di una grandezza molto più grande

EDIT

Grazie per le risposte. Posso usare BigInteger per i grandi numeri interi, l'unico limite è la memoria del computer (dovrebbe essere sufficiente). Per i decimali, userò float^e, come suggerito da @WebDaldo, o BigDecimal (simile a BigInteger), come suggerito da @kocko.

risposta

19

È possibile utilizzare la classe 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); 

uscita:

Somma: 3677593528178171109762168924892318

prodotto: 1938839471287900434078965247064711159607977007048190357000119602656

Devo dire BigDecimal, che è eccellente per i calcoli ammontano confronta con doppia.

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

uscita:

$ 123,234,545.48

+0

sai qual è il valore più grande di 'BigInteger'? –

+0

@Jon: Probabilmente da qualche parte sopra 2^1000000. Dipende da quanta memoria hai, davvero. – cHao

+2

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

11

Puoi provare a utilizzare la classe BigInteger per operazioni con numeri interi veramente enormi.

Per le operazioni con numeri mobili, Java fornisce la classe BigDecimal, che può essere utile anche.

2

È possibile utilizzare galleggiante^e

modo si potrebbe avere

0.55342663552772737682136182736127836782163 * 10^e 

Calcolatrici sono per lo più utilizzano t cappello, anche.

+1

Un java 'float' non è precisione arbitraria ... –

+1

Un float ha solo circa 8 cifre decimali di precisione. Probabilmente dovresti evitare di usarlo. – Joni

+1

(http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3) I tipi a virgola mobile sono float e double, che sono concettualmente associati a i valori e le operazioni IEEE 754 a 64 bit a precisione singola e precisione a 32 bit come specificato nello standard IEEE per aritmetica binaria a virgola mobile, standard ANSI/IEEE 754-1985 (IEEE, New York). – JavaDM

4

Per i calcoli con esponenti, come si farebbe con una calcolatrice, è necessario utilizzare BigDecimal. Il problema con BigInteger consiste nel fatto che gestisce solo numeri interi (senza numeri frazionari) e che per numeri veramente grandi come 10^100 memorizza tutti gli zeri, usando molta memoria, invece di usare un formato basato sulla notazione scientifica.

In alternativa è possibile utilizzare il numero a virgola mobile tipo double, che offre un ampio intervallo di valori, utilizzo della memoria insufficiente e operazioni veloci.Ma a causa di problemi di arrotondamento e di precisione limitata (circa 16 cifre decimali), non consiglierei di usarlo a meno che tu non sappia davvero cosa stai facendo.

1

Questo è per tutti i numeri più grandi sopra i 15 da quando si usa. Potresti voler trovare il fattoriale di 50 o 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)); 
     } 
    } 
+4

Sebbene il codice sia apprezzato, dovrebbe sempre avere una spiegazione di accompagnamento. Questo non deve essere lungo ma è previsto. – peterh

+0

Questo è per tutti i numeri più grandi sopra i 15 da quando si usa int lo fa. Potresti voler trovare il fattoriale di 50 o 100 0r 500. Funziona. – kamals1986

+0

pubblico class fattoriale { \t BigInteger fatFactorial (int b) { \t \t se (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 ritorno BigInteger.valueOf (b) .multiply (fatFactorial (b - 1)); \t \t}} \t \t void main (String [] args) {public static \t \t fac fattoriale = new fattoriale(); \t \t System.out.println ("I numeri Fat fatto di" + 500 + "=" \t \t \t \t + fac.fatFactorial (500)); \t} } – kamals1986