2015-06-25 7 views
11

Ich muss mit großen Zahlen arbeiten (etwas in Reichweite 1E100 - 1E200). Die Klasse BigInteger, die im Allgemeinen geeignet zu sein scheint, erkennt jedoch keine Strings im wissenschaftlichen Format während der Initialisierung und unterstützt auch nicht die Umwandlung in eine Zeichenfolge im Format.Initialisierung mit String im wissenschaftlichen Format 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 

Gibt es einen Weg herum? Ich kann mir nicht vorstellen, dass eine solche Klasse mit der Annahme entworfen wurde, dass Benutzer Hunderte von Nullen eingeben müssen.

Antwort

11

Wissenschaftliche Notation gilt für BigInteger s nur in einem begrenzten Umfang - d. H. Wenn die Zahl vor E so viele Nachkommastellen hat wie der Wert des Exponenten. In allen anderen Situationen würden einige Informationen verloren gehen.

Java bietet eine Möglichkeit, dies zu umgehen, indem man BigDecimal die wissenschaftliche Notation für Sie, analysieren und dann den Wert auf BigInteger Umwandlung mit toBigInteger Methode:

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

Umstellung auf wissenschaftliche Schreibweise kann durch den Bau BigDecimal erfolgen unter Verwendung eines constructor that takes BigInteger:

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