2015-12-22 11 views
6

Ich habe seltsame Fehler in meinem Code getroffen.BigDecimal stripTrailingZeros funktioniert nicht für Null

Sie bezieht mit

new BigDecimal("1.2300").stripTrailingZeros() 

kehrt 1.23 (korrekt)

aber

new BigDecimal("0.0000").stripTrailingZeros() 

kehrt 0.0000 (seltsam), so dass nichts passiert

Warum?

Wie es zu beheben?

+0

Ich bekomme '0' ... Kannst du eine MVCE posten? – Tom

+1

Ich bekomme auch '0' - JDK 8u66. Welche Java-Version verwendest du? Was meinst du mit "returns 0.0000" - meinst du 'toString()' druckt es als '0.0000'? –

+0

Ich benutze Java 6u45 – gstackoverflow

Antwort

8

Scheint, dass es ein Bug ist. Aber es ist in Java 8 behoben. Direkte URL für fix.

Es gibt Abhilfe für dieses:

BigDecimal zero = BigDecimal.ZERO; 
if (someBigDecimal.compareTo(zero) == 0) { 
    someBigDecimal = zero; 
} else { 
    someBigDecimal = someBigDecimal.stripTrailingZeros(); 
} 

finden Sie in diesem link.

Auch guter Punkt von Holger in den Kommentaren

Sie keine Ressourcen verschwenden Sie Ihre eigene Null-Instanz erstellen. Verwenden Sie BigDecimal.ZERO.

+0

Warum downvoting? Ich habe mit ähnlichen Problemen auf der älteren Version von jdk konfrontiert. Übrigens ist in der Antwort ein direkter Link zu diesem Bug. –

+0

ich kann nicht jdk Version in meinem Projekt ändern) Gibt es einen anderen Weg? – gstackoverflow

+0

@gstackoverflow Wenn Sie Ihre JDK-Version nicht aktualisieren können, müssen Sie das Update manuell mit etwas wie diesem durchführen: 'BigDecimal stripped = blub.intValue() == 0? BigDecimal.ZERO: blub.stripTrailingZeros(); '. – Tom

0

Hier ist die Javadoc für diese Methode, die sicher, dass nicht das beabsichtigte Verhalten legt nahe, ist aber nicht schlüssig: http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#stripTrailingZeros()

genau, warum es nicht zu tun, ist dies für die Umsetzung ist nach unten, dann . Welches JDK verwendest du? Für OpenJDK können wir die source sehen, um herauszufinden, wie es zu dieser Schlussfolgerung kommt, aber andere JDKs können sich unterscheiden.