2017-02-23 3 views
1

einen Float-Wert von 37.35 Versorgung erhalte ich eine Reihe von 37.3Odd Ergebnis aus DecimalFormat Rounding Halbhoch

Hier ist mein Code.

DecimalFormat format = new DecimalFormat(".0"); 
format.setRoundingMode(RoundingMode.HALF_UP); 
return format.format(37.35f); 

Ich würde erwarten, eine Reihe von 37.4 zu erhalten. Was mache ich falsch?

Ich denke, es kann aufgrund der Übergabe eines Float in aber ich habe keine Wahl hinsichtlich der Art der Variable, die ich erhalte. Auch wenn die tatsächliche Darstellung des float37.3500221215051544 war, sollte es noch aufgerundet werden?

Der ganze Punkt der Formatierung dieses Wertes zu einer Zeichenfolge ist so, dass ich es an BigDecimal übergeben kann und genaue Werte wie 37.4 haben.

Antwort

1

37,35 tatsächlich näher an 37,3 dann bis 37,4. Sie können es noch lohnenswerter folgenden Code überprüfen:

System.out.println(37.35f-37.3f); 
System.out.println(37.4f-37.35f); 

in druckt 0.049999237 und 0.05000305.

Mit double Datentyp ist das Ergebnis unterschiedlich.

Um dieses Problem zu lösen, fügen Sie einfach ein kleines Delta zu Ihren Zahlen hinzu. Zum Beispiel 0,01.

+0

Bitte u BigDecimal Klasse in Java verwenden müssen! Es hat eine Methode, um zu runden und das gewünschte Format zu bekommen, wie String, Double, etc. Und das Wichtigste ist, dass Sie die Genauigkeit nicht mit dieser Klasse verlieren! – Catluc

0

Dieses Problem ist aufgrund der Genauigkeit von Float-Datentyp in der Gleitkommaarithmetik des Computers. Wie @Zefick in seiner Antwort zeigt, ist die Darstellung von 37,35 wie float tatsächlich näher bei 37,3 als bei 37,4; weil es etwas weniger als 37,35 ist.

Die Verwendung von doppelter Genauigkeit löst das Problem, aber da dies eine Einschränkung ich einen Wrapper schlage vor, mit:

return format.format(Double.valueOf(String.valueOf(37.35f)));