|
|
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
− | In unserem Artikel über die Klasse [https://www.java-blog-buch.de/11-02-mathematisches-mit-java-lang-math/ 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.
| |
− | | |
− | =Math.floor()=
| |
− | | |
− | =Math.ceil()=
| |
− | | |
− | =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]] | |