HOWTO · Csharp
Runden Sie einen Double-Wert auf einen ganzzahligen Wert in C#
In C# gibt es mehrere Möglichkeiten, einen `double` in einen ganzzahligen Wert umzuwandeln: `Math.Ceiling()` rundet in Richtung plus unendlich, `Math.Floor()` in Richtung minus unendlich und `Math.Round()` auf den nächstgelegenen ganzzahligen Wert.
Auf dieser Seite
Wählen Sie zuerst die Rundungsregel, wenn Sie einen double in int umwandeln. Verwenden Sie Math.Ceiling() für die Rundung in Richtung plus unendlich, Math.Floor() für die Richtung minus unendlich und Math.Round() für den nächstgelegenen ganzzahligen Wert. Eine Umwandlung wie (int)value schneidet den Nachkommateil in Richtung null ab; sie rundet nicht.
Die drei mathematischen Methoden geben einen ganzzahligen double zurück. Wenn ein int benötigt wird, wandeln Sie das Ergebnis daher um. Prüfen Sie vor der Umwandlung, ob das Ergebnis im Wertebereich von int liegt, wenn große Eingabewerte möglich sind.
Wählen Sie die Rundungsregel vor der Umwandlung in int
Die Richtung ist bei Werten auf beiden Seiten von null entscheidend. Zum Beispiel ergibt Math.Ceiling(-8.3) den Wert -8, während Math.Floor(-8.3) den Wert -9 ergibt. Keine der beiden Methoden bedeutet einfach „den Nachkommateil entfernen“. Wählen Sie anhand dieses Vergleichs die passende Operation für Ihre Anwendung:
| Operation | Regel | Beispielergebnis für 8.3 |
Beispielergebnis für -8.3 |
|---|---|---|---|
Math.Ceiling(value) |
Richtung plus unendlich | 9 |
-8 |
Math.Floor(value) |
Richtung minus unendlich | 8 |
-9 |
Math.Round(value) |
Nächster ganzzahliger Wert; Gleichstände in der Mitte werden standardmäßig zur geraden Zahl gerundet | 8 |
-8 |
(int)value |
Abschneiden in Richtung null | 8 |
-8 |
Die Tabelle zeigt die Werte vor der Umwandlung; jede mathematische Methode gibt double zurück. Eine explizite Umwandlung in int erhält diese ganzzahligen Werte, sofern sie im Wertebereich des Typs liegen. Welche Regel richtig ist, hängt davon ab, wofür die Zahl steht: Für eine Anzahl, eine Grenze oder einen Näherungswert kann jeweils eine andere Regel geeignet sein.
Führen Sie dieses eigenständige Beispiel aus. Die Bezeichnungen in der Beispielausgabe bleiben auf Englisch.
using System;
class Program
{
static void Main()
{
double value = 8.3;
double otherValue = -8.3;
Console.WriteLine($"Ceiling: {(int)Math.Ceiling(value)}, {(int)Math.Ceiling(otherValue)}");
Console.WriteLine($"Floor: {(int)Math.Floor(value)}, {(int)Math.Floor(otherValue)}");
Console.WriteLine($"Nearest: {(int)Math.Round(value)}, {(int)Math.Round(otherValue)}");
Console.WriteLine($"Cast: {(int)value}, {(int)otherValue}");
Console.WriteLine($"Midpoints: {(int)Math.Round(2.5)}, {(int)Math.Round(3.5)}, {(int)Math.Round(2.5, MidpointRounding.AwayFromZero)}");
}
}
Mit Math.Ceiling() aufrunden
Math.Ceiling() gibt den kleinsten ganzzahligen double zurück, der größer oder gleich dem Eingabewert ist. Dabei wird in Richtung plus unendlich gerundet: Ein positiver Wert mit Nachkommateil wird auf die nächste ganze Zahl erhöht, während ein negativer Wert mit Nachkommateil zur näher bei null liegenden ganzen Zahl wechselt. Wandeln Sie das Ergebnis erst dann in int um, wenn Sie geprüft haben, dass es sich als int darstellen lässt.
Verwenden Sie diese Regel, wenn das Ergebnis niemals kleiner als der ursprüngliche Wert sein darf, etwa um zu bestimmen, wie viele ganze Behälter für eine Menge benötigt werden. Zum Beispiel ergibt Math.Ceiling(7.3) den ganzzahligen double-Wert 8; (int)Math.Ceiling(7.3) liefert bei einem passenden Wertebereich von int eine Ganzzahl. Wenn Sie stattdessen „vom Betrag her aufrunden“ meinen, ist Ceiling bei Werten unter null nicht die passende Regel.
Mit Math.Floor() abrunden
Math.Floor() gibt den größten ganzzahligen double zurück, der kleiner oder gleich dem Eingabewert ist. Die Rundung erfolgt in Richtung minus unendlich. Daher ergibt Math.Floor(7.8) den Wert 7 und Math.Floor(-7.8) den Wert -8. Das ist wichtig: Bei einem Wert unter null entfernt Abrunden nicht einfach nur die Nachkommastellen.
Verwenden Sie Math.Floor(), wenn das Ergebnis den Eingabewert nicht überschreiten darf, zum Beispiel beim Berechnen der Anzahl vollständiger Einheiten in einer gemessenen Menge. Wie bei Ceiling sollten Sie den zurückgegebenen double nur dann in int umwandeln, wenn das Ergebnis im Wertebereich des Ganzzahltyps liegt. Wenn Sie den Nachkommateil unabhängig vom Vorzeichen in Richtung null abschneiden möchten, verwenden Sie stattdessen eine Umwandlung oder Math.Truncate().
Mit Math.Round() auf die nächste ganze Zahl runden
Math.Round() wählt den nächstgelegenen ganzzahligen Wert aus und gibt ihn als double zurück. Standardmäßig gilt bei genau mittigen Werten die Regel „zur geraden Zahl“: Liegt ein Wert genau zwischen zwei ganzen Zahlen, wird die gerade gewählt. Zum Beispiel ergibt Math.Round(2.5) den Wert 2, während Math.Round(3.5) den Wert 4 ergibt. Das verringert eine gerichtete Verzerrung bei wiederholten Berechnungen mit mittigen Werten.
Für die andere verbreitete Regel bei Gleichständen übergeben Sie MidpointRounding.AwayFromZero: Math.Round(2.5, MidpointRounding.AwayFromZero) ergibt 3, und Math.Round(-2.5, MidpointRounding.AwayFromZero) ergibt -3. Diese Option ändert die Behandlung mittiger Werte; sie bewirkt nicht, dass jeder Wert vom Betrag her aufgerundet wird. Wandeln Sie das gerundete Ergebnis bei Bedarf in int um, sofern es im Wertebereich liegt.
Binäre Gleitkommazahlen können manche Dezimalbrüche nur näherungsweise darstellen. Soll ein Wert genau in der Mitte liegen, wurde aber aus anderen Gleitkommazahlen berechnet, kann sein gespeicherter Wert geringfügig auf einer Seite des Mittelpunkts liegen. Wenn Ihre Regeln von exakten Dezimalwerten abhängen, können Sie den Wertebereich mit decimal und der entsprechenden Math.Round-Überladung darstellen und trotzdem den gewünschten Modus für mittige Werte auswählen.
Warum eine Umwandlung keine Rundung ist
Eine explizite Umwandlung von double in int schneidet den Nachkommateil in Richtung null ab. Zum Beispiel wird (int)8.9 zu 8 und (int)(-8.9) zu -8. Das zweite Ergebnis unterscheidet sich von Math.Floor(-8.9), das -9 ergibt, und von einer Rundung auf den nächsten Wert, bei der die gewählte Regel für mittige Werte entscheidet.
Verwenden Sie eine Umwandlung, wenn Abschneiden beabsichtigt ist, nicht als Abkürzung für „auf eine ganze Zahl runden“. Kann der Eingabewert außerhalb des int-Wertebereichs liegen, prüfen und behandeln Sie diesen Bereich vor der Umwandlung ausdrücklich; andernfalls entspricht das Ergebnis möglicherweise nicht dem erwarteten Wert Ihrer Anwendung. Kurz gesagt: Verwenden Sie Math.Ceiling() für eine Grenze in Richtung plus unendlich, Math.Floor() für eine Grenze in Richtung minus unendlich, Math.Round() für die nächste ganze Zahl und eine Umwandlung nur zum Abschneiden in Richtung null.