Gleitkommazahlen mit Java runden

Aus Byte-Welt Wiki
(Weitergeleitet von Runden mit Java)
Zur Navigation springenZur Suche springen

In unserem Artikel über die Klasse java.lang.Math haben wir auf unserer eLerning-Plattform Java-Blog-Buch bereits einige Dinge zum Thema Runden mit Java besprochen. Mit einigen Code-Beispielen möchten wir hier noch einmal abrunden.

Cast

Eine einfache und ungenaue Methode zu runden ist, der Gleitkommazahl die Nachkommastellen einfach abzuschneiden. Beim Casten wird also immer abgerundet. In einigen Fällen kann das genügen, in den meisten jedoch nicht.

   /**
   * Schneidet Nachkommastellen einer Gleitkommazahl ab.
   *
   * @param value ist der Gleitkommazahlenwert, dem die Nachkommastellen abgeschnitten werden sollen
   */
   private int cutOffDecimalPlaces(double value) {
      return (int) value;
   }

Nach Übergabe der Zahl 1234.565 erhalten wir 1234 als Rückgbewert.

Math.round()

Die Klasse java.lang.Math bietet eine Methode zum (kaufmännischem) Runden von Gleitkommazahlen an. Mit dieser können wir recht einfach eine eigene Methode schreiben, die uns Dezimalzahlen auf eine beliebige Anzahl Nachkommastellen rundet.

   /**
   * Rundet den übergebenen Wert auf die Anzahl der übergebenen Nachkommastellen
   *
   * @param value ist der zu rundende Wert.
   * @param decimalPoints ist die Anzahl der Nachkommastellen, auf die gerundet werden soll.
   */
   private double round(double value, int decimalPoints) {
      double d = Math.pow(10, decimalPoints);
      return Math.round(value * d) / d;
   }

Der Aufruf der Methode in einer Klasse zum Runden einer Zahl auf zwei Nachkommastellen sieht dann z.B. so aus:

   System.out.println(round(1234.565, 2);

Math.rint()

Die Methode rint() rundet double-Werte mathematisch.

/**
 * Rundet den übergebenen Wert auf die Anzahl der übergebenen Nachkommastellen
 *
 * @param value ist der zu rundende Wert.
 * @param decimalPoints ist die Anzahl der Nachkommastellen, auf die mathematisch gerundet werden soll.
 */
private double rint(double value, int decimalPoints) {
   double d = Math.pow(10, decimalPoints);
   return Math.rint(value * d) / d;
}

Math.floor()

Die Methode floor() rundet auf die nächst kleinere Zahl.

Math.ceil()

Die Methode ceil() rundet auf die nächst größere Zahl.

String#format()

In Programmen müssen Ergebnisse von Berechnungen oft für eine Ausgabe passend formatiert werden. Dazu gehört auch das Runden, bspw. von Euro-Beträgen.

import java.util.Locale;

public class Formatter {
   public static void main(String[] args) {
      double number = 1234.565;
      System.out.println(number+" gerundet: "+String.format("%1.2f €", number));
   }
}

Möchte man bspw. das englische oder französische Zahlenformat ausgeben, muss noch ein passendes Locale als erster Parameter der format()-Methode übergeben werden.

String.format(Locale.FRENCH, "%1.2f", number)

Ansonsten wird das von der JRE erkannte Locale des Betriebssystems verwendet.

NumberFormat

Auch relativ einfach ist das Runden von Dezimalzahlen mit NumberFormat.

import java.text.NumberFormat;

public class Formatter {
   public static void main(String[] args) {
      double number = 1234.565;
      NumberFormat formatter = NumberFormat.getInstance();
      formatter.setMaximumFractionDigits(2);
      System.out.println(number+" gerundet: "+formatter.format(number));
   }
}

Mit Hilfe der Methode NumberFormat#setMaximumFractionDigits(int value) auf eine festgelegte Anzahl an Nachkommastellen begrenzen. Dabei wird auch eine Rundung der Zahl vorgenommen. Möchte man bspw. das englische oder französische Zahlenformat ausgeben, muss noch ein passendes Locale als Parameter der getInstance()-Methode übergeben werden.

NumberFormat formatter = NumberFormat.getInstance(Locale.FRENCH);

Ansonsten wird das von der JRE erkannte Locale des Betriebssystems verwendet.

DecimalFormat

Noch eine einfache Variante für das Runden von Gleitkommazahlen mit Java - mit DecimalFormat.

DecimalFormat ist eine Subklasse von NumberFormat für die Formatierung von Dezimalzahlen. Als Unterklasse von NumberFormat stehen auch hier Formatierungen von Dezimalzahlen in Abhängigkeit des Gebietsschemas zur Verfügung.

import java.text.DecimalFormat;

public class Formatter {
   public static void main(String[] args) {
      double number = 1234.565;
      DecimalFormat formatter = new DecimalFormat("#.##");
      System.out.println(number+" gerundet: "+formatter.format(number));
   }
}

DecimalFormat unterstützt verschiedene lokalisierbare Zahlen-Typen, so auch Ganzzahlen (123), Festkommazahlen (123,4), wissenschaftliche Notation (1,23E4), Prozentangaben (12%) und Währungsbeträge (123 $).


Fragen

Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!

Wir helfen dir gerne!


Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!

Du musst angemeldet sein, um einen Kommentar abzugeben.


Siehe auch