So runden Sie eine Zahl in Java auf N Dezimalstellen

1. Übersicht

In diesem kurzen Artikel werden wir uns ansehen, wie eine Zahl in Java auf n Dezimalstellen gerundet wird .

2. Dezimalzahlen in Java

Java bietet zwei primitive Typen, die zum Speichern von Dezimalzahlen verwendet werden können: float und double . Double ist der standardmäßig verwendete Typ:

double PI = 3.1415;

Beide Typen sollten jedoch niemals für genaue Werte wie Währungen verwendet werden. Dafür und auch zum Runden können wir die BigDecimal- Klasse verwenden.

3. Formatieren einer Dezimalzahl

Wenn wir nur eine Dezimalzahl mit n Nachkommastellen drucken möchten , können wir einfach die Ausgabezeichenfolge formatieren:

System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // OUTPUTS: Value with 3 digits after decimal point 3.142

Alternativ können wir den Wert mit der DecimalFormat- Klasse formatieren :

DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));

Mit DecimalFormat können wir das Rundungsverhalten explizit festlegen und so die Ausgabe besser steuern als mit String.format () .

4. Double s mit BigDecimal runden

Um doppelte s auf n Dezimalstellen zu runden , können wir eine Hilfsmethode schreiben :

private static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); }

Bei dieser Lösung ist eine wichtige Sache zu beachten - beim Erstellen von BigDecimal ; Wir müssen immer den BigDecimal (String) -Konstruktor verwenden . Dies verhindert Probleme bei der Darstellung ungenauer Werte.

Wir können dasselbe erreichen, indem wir die Apache Commons Math-Bibliothek verwenden:

 org.apache.commons commons-math3 3.5 

Die neueste Version finden Sie hier.

Sobald die Bibliothek zum Projekt hinzugefügt wurde, können wir die Precision.round () -Methode verwenden, die zwei Argumente akzeptiert - Wert und Skalierung:

Precision.round(PI, 3);

Standardmäßig wird dieselbe HALF_UP- Rundungsmethode wie bei unserer Hilfsmethode verwendet. Daher sollten die Ergebnisse gleich sein.

Beachten Sie, dass wir das Rundungsverhalten ändern können, indem wir die gewünschte Rundungsmethode als dritten Parameter übergeben.

5. Doppelrunden mit DoubleRounder

DoubleRounder ist ein Dienstprogramm in der Bibliothek decimal4j. Es bietet eine schnelle und müllfreie Methode zum Runden von Doppelwerten von 0 auf 18 Dezimalstellen.

Wir können die Bibliothek abrufen (die neueste Version finden Sie hier), indem wir die Abhängigkeit zur Datei pom.xml hinzufügen :

 org.decimal4j decimal4j 1.0.3 

Jetzt können wir einfach verwenden:

DoubleRounder.round(PI, 3);

Allerdings DoubleRounder nicht in einigen Szenarien, zum Beispiel:

System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 instead of expected 256.03

6. Math.round () -Methode

Eine andere Möglichkeit, Zahlen zu runden, ist die Verwendung der Math.Round () -Methode.

In diesem Fall können wir n Dezimalstellen durch Multiplizieren und Dividieren mit 10 ^ n steuern :

public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }

Diese Methode wird nicht empfohlen, da der Wert abgeschnitten wird . In vielen Fällen werden Werte falsch gerundet:

System.out.println(roundAvoid(1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // OUTPUTS: 260.77 instead of expected 260.78

Daher wird diese Methode hier nur zu Lernzwecken aufgeführt.

7. Fazit

In diesem kurzen Tutorial haben wir verschiedene Techniken zum Runden von Zahlen auf n Dezimalstellen behandelt.

Wir können die Ausgabe einfach formatieren, ohne den Wert zu ändern, oder wir können die Variable mithilfe einer Hilfsmethode runden. Wir haben auch einige Bibliotheken behandelt, die sich mit diesem Problem befassen.

Der während der Diskussion verwendete Code ist auf GitHub zu finden.