Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

RundungsProblem bei Decimal Format

Empfohlene Antworten

Veröffentlicht

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

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

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 ...

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

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.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.