Fließkommazahlen mit Java runden: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
(Weiterleitung nach Gleitkommazahlen mit Java runden erstellt)
(Markierung: Neue Weiterleitung)
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
In unserem [https://www.java-blog-buch.de/11-02-mathematisches-mit-java-lang-math/ Artikel über die Klasse java.lang.Math] haben wir auf unserer eLerning-Plattform [https://www.java-blog-buch.de/ Java-Blog-Buch] bereits einige Dinge zum Thema Runden mit Java besprochen. Mit einigen Code-Beispielen möchten wir hier noch einmal abrunden.
+
#WEITERLEITUNG [[Gleitkommazahlen mit Java runden]]
  
=Cast=
+
[[Kategorie:Java]]
Eine einfach und ungenaue Methode zu runden ist, der Fließkommazahl die Nachkommastellen einfach abzuschneiden. Beim Casten wird also immer abgerundet. In einigen Fällen kann das genügen, in den meisten jedoch nicht.
 
<syntaxhighlight lang="java">
 
  /**
 
  * Schneidet Nachkommastellen einer Fließkommazahl ab.
 
  *
 
  * @param value ist der Fließkommazahlenwert, dem die Nachkommastellen abgeschnitten werden sollen
 
  */
 
  private int cutOffDecimalPlaces(double value) {
 
      return (int) value;
 
  }
 
</syntaxhighlight>
 
Nach Übergabe der Zahl 1234.565 erhalten wir 1234 als Rückgbewert.
 
 
 
=Math.round()=
 
Die Klasse {{JAPI|java.lang.Math}} bietet eine [[Methode]] zum ([https://de.wikipedia.org/wiki/Rundung#Kaufm%C3%A4nnisches_Runden kaufmännischem]) Runden von Fließkommazahlen an. Mit dieser können wir recht einfach eine eigene Methode schreiben, die uns Dezimalzahlen auf eine beliebige Anzahl Nachkommastellen rundet. Es wird allerdings hier nur die letzte Kommastelle beachtet.
 
<syntaxhighlight lang="java">
 
  /**
 
  * 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;
 
  }
 
</syntaxhighlight>
 
 
 
Der Aufruf der Methode in einer [[Klasse]] zum Runden einer Zahl auf zwei Nachkommastellen sieht dann z.B. so aus:
 
<syntaxhighlight lang="java">
 
  System.out.println(round(1234.565, 2);
 
</syntaxhighlight>
 
 
 
=Math.rint()=
 
Die Methode rint() rundet double-Werte mathematisch.
 
<syntaxhighlight lang="java">
 
/**
 
* 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;
 
}
 
</syntaxhighlight>
 
 
 
=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'''.
 
 
 
<syntaxhighlight lang="java">
 
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));
 
  }
 
}
 
</syntaxhighlight>
 
Möchte man bspw. das englische oder französische Zahlenformat ausgeben, muss noch ein passendes {{JAPI|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 [[Betriebssystem|Betriebssystems]] verwendet.
 
 
 
=NumberFormat=
 
Auch relativ einfach ist das Runden von Dezimalzahlen mit [[NumberFormat]].
 
 
 
<syntaxhighlight lang="java">
 
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));
 
  }
 
}
 
</syntaxhighlight>
 
 
 
Mit Hilfe der Methode <code>NumberFormat#setMaximumFractionDigits(int value)</code> 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 {{JAPI|Locale}} als Parameter der <code>getInstance()</code>-[[Methode]] übergeben werden.
 
NumberFormat formatter = NumberFormat.getInstance(Locale.FRENCH);
 
Ansonsten wird das von der [[JRE]] erkannte Locale des [[Betriebssystem|Betriebssystems]] verwendet.
 
 
 
=DecimalFormat=
 
Noch eine einfache Variante für das Runden von Fließkommazahlen mit Java - mit [[DecimalFormat]].
 
 
 
{{JAPI|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.
 
 
 
<syntaxhighlight lang="java">
 
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));
 
  }
 
}
 
</syntaxhighlight>
 
 
 
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 stellen}}
 
 
 
=Siehe auch=
 
*{{JAPI|NumberFormat}}
 
*{{JAPI|DecimalFormat}}
 
*[[String]]
 
*{{JAPI|String}}
 
 
 
[[Kategorie:Java-Codeschnipsel]]
 

Aktuelle Version vom 7. November 2021, 16:44 Uhr