2012-12-16 10 views
38

Ich habe ein BigDecimal-Objekt, und ich möchte es in Zeichenfolge konvertieren. Das Problem ist, dass mein Wert bekam Fraktion und ich bekomme eine große Zahl (in der Länge) und ich brauche nur die ursprüngliche Zahl in Zeichenfolge zum Beispiel: fürBigDecimal zu string

BigDecimal bd = new BigDecimal(10.0001) 
System.out.println(bd.toString()); 
System.out.println(bd.toPlainString()); 

der Ausgang ist:

10.000099999999999766941982670687139034271240234375 
10.000099999999999766941982670687139034271240234375 

und ich brauche die genau löschte, um die Anzahl 10.0001 in string

Antwort

81

um genau 10.0001 müssen Sie den String-Konstruktor verwenden oder valueOf (die eine BigDecimal auf der kanonischen Darstellung der Doppel basierend Konstrukte):

BigDecimal bd = new BigDecimal("10.0001"); 
System.out.println(bd.toString()); // prints 10.0001 
//or alternatively 
BigDecimal bd = BigDecimal.valueOf(10.0001); 
System.out.println(bd.toString()); // prints 10.0001 

Das Problem mit new BigDecimal(10.0001) ist, dass das Argument ein double ist, und es kommt vor, dass nicht verdoppelt 10.0001 genau darstellen kann. Also 10.0001 ist "transformiert" zu den nächsten möglichen Doppel, das ist 10.000099999999999766941982670687139034271240234375 und das ist, was Ihre BigDecimal zeigt.

Aus diesem Grund ist es selten sinnvoll, den Doppelkonstruktor zu verwenden.

Sie mehr darüber hier lesen können, Moving decimal places over in a double

+0

Eine effizientere Art und Weise der ein 'double' auf diese Weise zu konvertieren, ist' BigDecimal.valueOf (double) zu verwenden; ' –

+0

@PeterLawrey Nicht sicher, dass ich verstehe. 'BigDecimal.valueOf (double)' "rundet" das Double auf die gleiche Art und Weise ab, wie Double beim Drucken abgerundet wird, was ziemlich komplexe Regeln verwendet, daher bin ich mir nicht sicher, wie Sie sich darauf verlassen können. – assylias

+0

'Übersetzt einen Double-Wert in einen BigDecimal-Wert und verwendet dabei die kanonische String-Repräsentation des Double, die von der Double.toString (double) -Methode bereitgestellt wird. Hinweis: Dies ist im Allgemeinen die bevorzugte Methode zum Konvertieren eines double (oder float) in ein BigDecimal, da der zurückgegebene Wert dem Wert entspricht, der sich aus dem Konstruieren eines BigDecimal aus dem Ergebnis der Verwendung von Double.toString (double) ergibt. " –

8

Ihre BigDecimal enthält nicht die Nummer 10.0001, weil Sie es mit einem double initialisiert und der double tat nicht ganz enthalten die Nummer, die Sie es gedacht hat getan. (Dies ist der ganze Sinn BigDecimal.)

Wenn Sie the string-based constructor statt:

BigDecimal bd = new BigDecimal("10.0001"); 

... dann wird es tatsächlich die Zahl enthalten, die Sie erwarten.

0

Der BigDecimal kann kein Doppel sein. können Sie Int-Nummer verwenden. Wenn Sie genau die eigene Nummer anzeigen möchten, können Sie den String-Konstruktor von BigDecimal verwenden.

wie folgt aus:

BigDecimal bd1 = new BigDecimal("10.0001"); 

jetzt können Sie bd1 als 10,0001

So einfach anzuzeigen. GUTES GLÜCK.

5

Mit der folgenden Methode können Sie java.math.BigDecimal in String konvertieren.

BigDecimal bigDecimal = new BigDecimal("10.0001"); 
    String bigDecimalString = String.valueOf(bigDecimal.doubleValue()); 
    System.out.println("bigDecimal value in String: "+bigDecimalString); 

Output:
BigDecimal Wert in String: 10.0001

1
// Convert BigDecimal number To String by using below method // 

public static String RemoveTrailingZeros(BigDecimal tempDecimal) 
{ 
    tempDecimal = tempDecimal.stripTrailingZeros(); 
    String tempString = tempDecimal.toPlainString(); 
    return tempString; 
} 

// Recall RemoveTrailingZeros 
BigDecimal output = new BigDecimal(0); 
String str = RemoveTrailingZeros(output); 
0

Um das notwendige Ergebnis mit Doppel Konstruktor archivieren Sie die BigDecimal abzurunden müssen, bevor wandeln es in String z.B.

neue java.math.BigDecimal (10,0001) .round (new java.math.MathContext (6, java.math.RoundingMode.HALF_UP)). ToString()

die "10.0001"

drucken
0

Für eine bessere Unterstützung verschiedener Sprachumgebungen verwenden diese Art und Weise:

DecimalFormat df = new DecimalFormat(); 
df.setMaximumFractionDigits(2); 
df.setMinimumFractionDigits(0); 
df.setGroupingUsed(false); 

df.format(bigDecimal); 

auch können Sie es anpassen:

DecimalFormat df = new DecimalFormat("###,###,###"); 
df.format(bigDecimal);