2015-06-25 3 views
11

Ho bisogno di lavorare con numeri grandi (qualcosa nel range 1E100 - 1E200). Tuttavia, la classe BigInteger, che sembra essere adatta in generale, non riconosce le stringhe in formato scientifico durante l'inizializzazione, così come non supporta la conversione in una stringa nel formato.Inizializzazione con stringa in formato scientifico in Java BigInteger?

BigDecimal d = new BigDecimal("1E10"); //works 
BigInteger i1 = new BigInteger("10000000000"); //works 
BigInteger i2 = new BigInteger("1E10"); //throws NumberFormatException 
System.out.println(d.toEngineeringString()); //works 
System.out.println(i1.toEngineeringString()); //method is undefined 

C'è un modo per aggirare? Non riesco a immaginare che tale classe sia stata progettata con l'assunto che gli utenti debbano digitare centinaia di zeri in input.

risposta

11

La notazione scientifica si applica a BigInteger s solo in un ambito limitato, ovvero quando il numero davanti a E presenta un numero di cifre inferiore o uguale a quello del decimale rispetto al valore dell'esponente. In tutte le altre situazioni alcune informazioni andrebbero perse.

Java fornisce un modo per ovviare a questo lasciando BigDecimal analizzare la notazione scientifica per voi, e quindi la conversione del valore di BigInteger utilizzando toBigInteger metodo:

BigInteger i2 = new BigDecimal("1E10").toBigInteger(); 

Conversione in notazione scientifica può essere fatto costruendo BigDecimal utilizzando un constructor that takes BigInteger:

System.out.println(new BigDecimal(i2).toEngineeringString());