1. Überblick

Runden einer Zahl auf N Dezimalstellen in Java

1. Überblick

In diesem kurzen Artikel erfahren Sie, wie Sie eine Zahl in Java aufnDezimalstellen runden.

Weitere Lektüre:

Anzahl der Stellen in einer Ganzzahl in Java

Erfahren Sie, wie Sie die Anzahl der Stellen einer Ganzzahl in Java auf unterschiedliche Weise ermitteln.

Read more

Überprüfen Sie, ob eine Zahl in Java Primzahl ist

Erfahren Sie, wie Sie die Primalität der Zahl mit Java überprüfen.

Read more

Überprüfen Sie, ob eine Zeichenfolge in Java numerisch ist

Untersuchen Sie verschiedene Möglichkeiten, um festzustellen, ob eine Zeichenfolge numerisch ist oder nicht.

Read more

2. Dezimalzahlen in Java

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

double PI = 3.1415;

Beide Typenshould never be used for precise values, z. B. Währungen. Dafür und auch zum Runden können wir die KlasseBigDecimalverwenden.

3. Formatieren einer Dezimalzahl

Wenn wir nur eine Dezimalzahl mitn Ziffern nach dem Dezimalpunkt 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 KlasseDecimalFormatformatieren:

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

MitDecimalFormat können wir das Rundungsverhalten explizit festlegen und so die Ausgabe besser steuern als mit den oben verwendetenString.format().

4. Rundung vonDoubles mitBigDecimal

Umdoubles aufn Dezimalstellen zu runden, können wirhelper method 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 Konstruieren vonBigDecimal; wir müssenalways use BigDecimal(String) constructor. Dies verhindert Probleme mit der Darstellung ungenauer Werte.

Wir können dasselbe erreichen, indem wir die BibliothekApache Commons Mathverwenden:


    org.apache.commons
    commons-math3
    3.5

Die neueste Version finden Sie unterhere.

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

Precision.round(PI, 3);

Standardmäßig wird dieselbe Rundungsmethode vonHALF_UPwie für unsere Hilfsmethode verwendet. Daher sollten die Ergebnisse gleich sein.

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

5. Rundung verdoppelt sich mitDoubleRounder

DoubleRounder ist ein Dienstprogramm in der Bibliothek vondecimal4j. 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 unterhere), indem Sie die Abhängigkeit zupom.xml hinzufügen:


    org.decimal4j
    decimal4j
    1.0.3

Jetzt können wir einfach verwenden:

DoubleRounder.round(PI, 3);

DoubleRounder schlägt jedoch in einigen Szenarien fehl, zum Beispiel:

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

6. Math.Round() Method

Eine andere Möglichkeit zum Runden von Zahlen ist die Verwendung der Math.Round () -Methode.

In diesem Fall können wir die Anzahl der Dezimalstellen innteuern, indem wir sie mit10^nmultiplizieren und dividieren:

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

This method is not recommended as it’s truncating the value. 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 aufnDezimalstellen behandelt.

Wir können die Ausgabe einfach formatieren, ohne den Wert zu ändern, oder 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 istover on GitHub.