2016-03-29 7 views
0

Warum erhalte ich folgende Ausgabe:Warum bekomme ich unterschiedliche BigDecimal-Rundungsergebnisse?

1,11

1,13

wenn unter Code ausführen:

public static void main(String[] args) { 

    double aDouble = 1.115; 
    double bDouble = 1.125; 

    System.out.println(roundTo2Decimal(aDouble)); 
    System.out.println(roundTo2Decimal(bDouble)); 
} 

public static BigDecimal roundTo2Decimal(double doubleToRound){ 
    BigDecimal bigDecimal = new BigDecimal(doubleToRound); 
    return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP); 
} 

statt erwartetem Ergebnis:

1,12

1.13?

+0

Die allgemeine Lektion ist hier, dass, wenn Sie Dezimalzahlen Pflege immer, sollten Sie nicht einmal _touch_ 'double'. –

Antwort

1

Ziemlich sicher, das ist nur Standard Floating Point Ungenauigkeit. 0,125 = 1/8, was genau binär ausgedrückt werden kann. 0,115 ist nicht so, es ist nicht genau gespeichert und wird anscheinend als etwas gespeichert, das von dem, was Sie erwarten, abrundet. Versuchen Sie System.out.println das doppelte selbst.

+0

Danke. Ich fand einige Informationen über fp Ungenauigkeit: http://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples – hqmr

2

Dies geschieht durch Präzisionsverlust bei 1.115 als doppelt vertreten:

1.115 = 1.114999999999999991118215803E0 
1.125 = 1.125E0 
0
<code> 
//to achieve what u need change your method to 
    public static BigDecimal roundTo2Decimal(double doubleToRound) { 
     BigDecimal bigDecimal = new BigDecimal(doubleToRound); 
     return bigDecimal.setScale(2, RoundingMode.CEILING); 
    } 

</code> 
+0

Obwohl dies den Autor mit den gewünschten Ergebnissen liefern kann, beantwortet es nicht die Frage, die gefragt wurde und sollte wahrscheinlich ein Kommentar stattdessen - wie: "* Anstelle von' BigDecimal.ROUND_HALF_UP', verwenden Sie 'RoundingMode.CEILING' *". – OhBeWise

+0

Aber für 1.11400 und 1.12400 brauche ich 1.11 und 1.12 entsprechend. RoundingMode.CEILING gibt diese Ergebnisse nicht an. – hqmr

Verwandte Themen