JavaRush /Java-Blog /Random-DE /Runden von Zahlen in Java

Runden von Zahlen in Java

Veröffentlicht in der Gruppe Random-DE
Gleitkommazahlen (Float, Double) werden bei der Berechnung von Ausdrücken verwendet, die eine Dezimalgenauigkeit erfordern. Bei Buchhaltungs- und anderen Rechenoperationen ist häufig eine hohe Genauigkeit erforderlich. Runden von Zahlen in Java - 1Aber brauchen wir immer einen langen „Schwanz“ an Zahlen nach dem Komma? Vielleicht reicht uns eine Genauigkeit von drei Realteilen? Und wir sind mit dieser Option zufrieden. Wie führt man die Rundung richtig durch? Genau darüber werden wir heute sprechen: Wir werden nach Möglichkeiten suchen, Zahlen in Java zu runden .

String-Format

Als erste Methode schauen wir uns die doppelte Rundung an:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Als Ergebnis formatieren wir unsere Gleitkommazahl 34766674 mit einer Genauigkeit von 3 Dezimalstellen , da wir in den Formatierungsanweisungen drei Dezimalstellen „%.3f“ angegeben haben. %f wiederum gibt beim Formatieren einer Zeichenfolge den Typ der Gleitkommazahl an Zahlen, zu denen in Java die Datentypen double und float gehören. Im obigen Beispiel geben wir den resultierenden Wert an die Konsole aus. Nun stellt sich die Frage: Wie könnten wir das verkürzen? Es ist ganz einfach: Sie müssen printf verwenden, was wiederum ist format + print. Als Ergebnis würde sich das vorherige Beispiel auf Folgendes reduzieren:
double value = 34.766674;
System.out.printf("%.3f",value);
Zusätzlich zu dieser Methode verfügt die Out-Instanz der PrintStream- Klasse auch über eine Formatmethode, die ähnlich funktioniert:
double value = 34.766674;
System.out.format("%.3f",value);
Die Rundung erfolgt im HALF_UP- Modus – hin zu der Zahl, die näher an der abzuschneidenden Zahl liegt (auf 0 oder 10). Sind diese Zahlen gleich weit auseinander (im Fall von 5), wird aufgerundet. Beispiel:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
Wir werden die Rundungsmodi weiter unten ausführlicher besprechen. Runden von Zahlen in Java - 2

DecimalFormat

Eine andere Möglichkeit ist die Verwendung der DecimalFormat- Klasse . Es wurde entwickelt, um jede beliebige Zahl in Java zu formatieren, sei es eine Ganzzahl oder eine Gleitkommazahl. Wenn wir DecimalFormat instanziieren, können wir ihm eine Formatzeichenfolge übergeben. Es zeigt an, wie viele Dezimalstellen für die Eingabe formatiert werden müssen. So würde unser Beispiel mit DecimalFormat aussehen :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
Die Zeile #.### ist ein Muster, das angibt, dass wir den übergebenen Wert auf drei Dezimalstellen formatieren. Um das Muster zu ändern, nachdem das DecimalFormat-Objekt erstellt wurde, können Sie dessen Methoden applyPattern und applyLocalizedPattern verwenden :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
Aber heute reden wir doch über Rundung, nicht wahr? Beim Abschneiden einer Zahl mit Dezimalstellen außerhalb des angegebenen Musters rundet DecimalFormat die Zahl auf, wenn die letzte abgeschnittene Zahl größer als 5 ist. Was aber, wenn die Zahl 5 ist? Es stellt sich heraus, dass es genau in der Mitte zwischen den nächsten ganzen Zahlen liegt. Was dann? In diesem Fall wird die bisherige Nummer berücksichtigt. Wenn es gerade ist, wird gerundet:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
Wenn es ungerade ist, wird es nicht ausgeführt:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
Es gibt einen kleinen Unterschied zwischen der Formatierung von Gleitkommazahlen mit String.format() und DecimalFormat.format(). Der erste gibt immer nachgestellte Nullen aus, auch wenn kein Bruchteil vorhanden ist. Z.B:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
Wie wir sehen können, gibt die format()-Methode von String beim Formatieren der Zahl 7,000132 auf drei Dezimalstellen 7,000 aus, während die format()-Methode von DecimalFormat 7 ausgibt. Das heißt, Sie können String.format( ) oder DecimalFormat wählen. format( ), je nachdem, ob Sie nachgestellte Nullen benötigen oder nicht. Mit den oben beschriebenen Methoden haben wir das Ergebnis in Form eines Strings erhalten. Schauen wir uns Möglichkeiten an, um genau die numerischen Werte wiederherzustellen.

Mathematik

Es ist unmöglich, eine spezielle Klasse zu erwähnen, die auf verschiedene arithmetische Operationen mit Zahlen zugeschnitten ist – Math . Runden von Zahlen in Java - 3Auch diese Klasse verfügt über Methoden zum Runden, diese erlauben es aber im Gegensatz zu den bereits beschriebenen nicht, eine bestimmte Anzahl an Nachkommastellen festzulegen, sondern auf eine ganze Zahl zu runden:
  • Math.ceil() rundet auf die nächste Ganzzahl auf, gibt aber keinen Ganzzahltyp, sondern ein Double zurück:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    Selbst wenn wir 34,0000000 haben, erhalten wir nach der Verwendung von Math.ceil immer noch 35,0.

    Math.floor() rundet auf die nächste Ganzzahl ab und gibt das Ergebnis ebenfalls als Double zurück:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    Selbst wenn wir einen Wert von 34,999999999 haben, erhalten wir nach der Verwendung von Math.floor wiederum 34,0.

  • Math.round() – rundet auf die nächste ganze Zahl und ergibt das Ergebnis int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    Wenn unsere Zahl 34,5 ist, wird sie auf 35 gerundet, wenn sie jedoch etwas kleiner als 34,499 ist, wird die Zahl auf 34 gekürzt.

    Um nicht einfach den gesamten Realteil abzuschneiden, sondern diesen Vorgang auf eine bestimmte Anzahl von Nachkommastellen zu regeln und gleichzeitig zu runden, wird die Zahl mit 10^n (10 hoch n) multipliziert, wobei n ist gleich der Anzahl der notwendigen Dezimalstellen. Danach verwenden sie eine Methode der Math- Klasse zum Runden und dividieren dann erneut durch 10^n:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow – benötigt zwei Argumente. Das erste ist die Zahl, das zweite ist die Potenz, auf die es erhöht werden muss.

Runden mit BigDecimal

BigDecimal ist eine Klasse, die es Ihnen ermöglicht, mit Gleitkommazahlen zu arbeiten. Sein Hauptmerkmal besteht insbesondere darin, dass es Bruchzahlen beliebiger Länge speichern kann (d. h. es gibt keine Begrenzung für den Zahlenbereich). Darüber hinaus speichert diese Klasse verschiedene Methoden zur arithmetischen Verarbeitung, einschließlich Rundung. Die Klasse dieses Objekts kann erstellt werden, indem der Konstruktor auf „double“, „string“ zur Anzeige einer Gleitkommazahl, „double“ und „ MathContext“ usw. gesetzt wird. MathContext ist eine Kombination aus RoundingMode und einer Zahl, die die Gesamtzahl der Ziffern im gesuchten Wert beschreibt. Rundungsregeln RoundingMode: DOWN – Rundung gegen Null. UP – Rundung vom Nullmodus aus. DECKE – Rundung in Richtung positive Unendlichkeit. BODEN – Rundung in Richtung negative Unendlichkeit. HALF_UP – Rundet auf den „nächsten Nachbarn“, wenn beide Nachbarn nicht den gleichen Abstand haben (d. h. wenn die gerundete Zahl 5 ist). In diesem Fall wird aufgerundet. HALF_DOWN – Aufrunden zum „nächsten Nachbarn“. Wenn beide Nachbarn nicht den gleichen Abstand haben, wird in diesem Fall abgerundet. HALF_EVEN – Rundet auf den „nächsten Nachbarn“, wenn beide Nachbarn nicht den gleichen Abstand haben. Runden Sie in diesem Fall auf den geraden Nachbarn (wie in DecimalFormat oben beschrieben). UNNECESSARY – Wird verwendet, um zu bestätigen, dass der angeforderte Vorgang das richtige Ergebnis liefert. Eine Rundung ist daher nicht erforderlich. Beispiel:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
Zusätzlich zur Möglichkeit, im Konstruktor eine Rundungsregel festzulegen, können Sie mit BigDecimal den Rundungsmodus festlegen, nachdem die Instanz erstellt wurde. Verwenden Sie dazu die setScale- Methode , in der Sie die Anzahl der Dezimalstellen und Rundungsregeln festlegen müssen:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal verfügt außerdem über interne int- Variablen zum Festlegen des Rundungsmodus ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...). Dabei handelt es sich um Rundungsregeln, die denen der RoundingMode- Klasse ähneln und in ähnlicher Weise in setScale verwendet werden :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
Lesen Sie mehr über die BigDecimal-Klasse in diesem Artikel .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION