ObiWanBelix Geschrieben 29. August 2007 Geschrieben 29. August 2007 Hallo, ich habe ein Problem(oder ich verstehs nur nicht) mit der rundung von float Werten Beispiel1 import java.text.*; public class FloatToStringPerPattern { public static void print(float value, String format) { DecimalFormat df = new DecimalFormat(format); System.out.println(df.format(value)); } public static void main(String[] args) { float value = 200.050f; print(value, "####.#"); } } Hier wird der Wert 200,1 ausgegeben, was soweit ich weiß ganz normales kaufmännisches runden ist(ab 5 wird aufgerundet) Beispiel2 import java.text.*; public class FloatToStringPerPattern { public static void print(float value, String format) { DecimalFormat df = new DecimalFormat(format); System.out.println(df.format(value)); } public static void main(String[] args) { float value = 200.50f; print(value, "####"); } } Hier bekomme ich die Ausgabe 200 !!:confused: Es kommt mir vor , also ob hier nicht über den DecimalPunkt hinaus gerundet wird. denn wenn ich wie in Beispiel 1 noch eine Decimalstelle tiefer ansetzte funktioniert es auch. Kann mir das jemand erklären? Wie gehe ich dann mit Preisen um? Dies ist auch bei Typ=double ObiWanBelix Zitieren
Jaraz Geschrieben 29. August 2007 Geschrieben 29. August 2007 Hi, du arbeitest mit Gleitkommazahlen. Exakt 200.50f; gibt es nicht. Um mit dem Problem umgehen zu können, nimmt man: Für das Rechnen und Runden: 'java.math.BigDecimal', (setScale Methode) Für das Formatieren: 'java.text.DecimalFormat'. Gruß Jaraz Zitieren
geloescht_Newlukai Geschrieben 29. August 2007 Geschrieben 29. August 2007 Auch auf die Gefahr hin, mich zu blamieren Warum sollte es den Wert 200.5 nicht geben? Daß es 200.50 vielleicht nicht gibt, ist ja verständlich, aber 200.5 sollte doch möglich sein. Und ohne mir die Java-API angesehen zu haben: Daß einmal gerundet wird, ein anderes Mal nicht, ist schon seltsam ... Zitieren
ObiWanBelix Geschrieben 30. August 2007 Autor Geschrieben 30. August 2007 Hallo Jaraz, könntest Du deine Aussage vieleicht noch näher erläuter, das wäre vieleicht sehr interessant. Warum gibt es 200,50 nicht? Bei dem Beispiel ist das Ergebnis auch das Gleiche wenn ich 200,5 nehme. ObiWanBelix Zitieren
Klotzkopp Geschrieben 30. August 2007 Geschrieben 30. August 2007 DecimalFormat rundet nicht kaufmännisch, sondern nach dem "half even"-Prinzip. Das steht auch in der Dokumentation. Dabei wird zur nächsten zum Format passenden Zahl gerundet. Wenn aber die Zahl genau zwischen zwei ins Format passenden Zahlen liegt (wie in diesem Fall), wird zum geraden Wert hin gerundet. Das ist in diesem Fall 200 (denn 201 ist ungerade). Jaraz bezog sich vermutlich auf die Tatsache, dass sich nicht jede Zahl exakt als Fließkommawert darstellen lässt. Zitieren
Jaraz Geschrieben 30. August 2007 Geschrieben 30. August 2007 Gleitkommazahl - Wikipedia Dezimalzahlen Schon einfache Dezimalzahlen, z. B. 0,1, können nicht mehr exakt als binäre Gleitkommazahlen dargestellt werden, da viele im Dezimalsystem abbrechende Kommazahlen im Binärsystem nicht abbrechende, periodische Zahlen sind; von diesen werden nur die ersten p Ziffern gespeichert, wodurch Ungenauigkeit entsteht. Dezimal 0,1 ist binär 0,0001100110011… In einem binären Gleitkommasystem ist also 10 · 0,1 < 1, da die 0,1 abgerundet wird und nicht den exakten Wert approximiert. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.