HOWTO · Csharp
Decimal in int in C# konvertieren
Wählen Sie beim Konvertieren von decimal in int in C# die passende Rundungsregel und behandeln Sie Werte außerhalb von Int32.
Auf dieser Seite
Um ein C#-decimal in ein int zu konvertieren, verwenden Sie einen expliziten Cast, wenn der Nachkommateil bewusst verworfen werden soll. Verwenden Sie Convert.ToInt32 für Runden auf die nächste ganze Zahl. Für immer ab-, immer auf- oder eine bestimmte Mittelwertregel runden Sie zuerst und casten danach. Jede Variante kann OverflowException auslösen, wenn der Wert nicht in Int32 passt.
Das ist eine Geschäftsregel, kein Formatdetail. -12.9m wird beim Abschneiden -12, mit Math.Floor dagegen -13. Behalten Sie decimal, wenn der Bruchteil wichtig bleibt, etwa für Geld oder Messungen.
Ein decimal in Richtung null abschneiden
Ein expliziter Cast, (int)value, ist bei beabsichtigtem Abschneiden am klarsten. Ein decimal-Literal benötigt das Suffix m; ohne dieses ist 12.9 ein double. Die Konvertierung in einen ganzzahligen Typ rundet Richtung null: positive Brüche werden kleiner, negative größer. Das ist weder Floor noch Ceiling. Die C#-Referenz zu numerischen Konvertierungen dokumentiert das Verhalten und den Bereichsfehler.
using System;
decimal positive = 12.9m;
decimal negative = -12.9m;
Console.WriteLine($"cast: {(int)positive}, {(int)negative}");
Console.WriteLine($"round: {Convert.ToInt32(12.5m)}, {Convert.ToInt32(13.5m)}");
try
{
decimal tooLarge = decimal.MaxValue;
Console.WriteLine(checked((int)tooLarge));
}
catch (OverflowException)
{
Console.WriteLine("overflow");
}
cast: 12, -12
round: 12, 14
overflow
Die erste Zeile zeigt das Abschneiden: beide Bruchteile entfallen und der negative Wert bewegt sich Richtung null. Die letzte Zeile ist der Grenzfall. checked macht den Überlauf sichtbar; der Catch meldet ihn, statt das Programm zu beenden.
Auf die nächste ganze Zahl runden
Convert.ToInt32(decimal) schneidet nicht ab. Es rundet zur nächsten vorzeichenbehafteten 32-Bit-Zahl und bei genau .5 zur geraden Zahl. Im geprüften Beispiel wird 12.5m zu 12, weil 12 gerade ist, und 13.5m zu 14. Das passt zu Messungen, überrascht aber, wenn Mittelwerte immer von null weg sollen.
Wählen Sie Convert.ToInt32 erst, wenn Rundung zur geraden Zahl die Regel Ihrer Anwendung ist. Die Dokumentation der decimal-Überladung nennt ebenfalls OverflowException außerhalb des int-Bereichs. Ein zu großes decimal wird dadurch nicht sicher.
Eine explizite Rundungsregel wählen
Für gerichtetes Runden rufen Sie zuerst eine Math-Methode für das decimal auf und konvertieren danach das bereits ganzzahlige Ergebnis. Math.Floor geht Richtung negativer Unendlichkeit, Math.Ceiling Richtung positiver. Bei negativen Brüchen unterscheidet sich das vom Abschneiden: Math.Floor(-12.9m) ist -13m, aber (int)-12.9m ist -12.
Benötigen Sie eine andere Gleichstandsregel, schreiben Sie sie in den Code. Math.Round(value, MidpointRounding.AwayFromZero) macht aus 2.5m den Wert 3m und aus -2.5m den Wert -3m; Math.Round(decimal) nutzt standardmäßig gerade Zahlen. Math.Truncate ist lesbar, wenn Sie vor der Konvertierung zu int einen ganzzahligen decimal Richtung null wollen.
Casten Sie nicht vor dem Runden: (int)value hat den Bruchteil schon entfernt; ein späteres Math.Round kann ihn nicht zurückbringen. Runden Sie zuerst, prüfen Sie den Bereich und casten Sie anschließend.
Werte außerhalb des int-Bereichs behandeln
Ein int ist vorzeichenbehaftet und 32 Bit breit, von int.MinValue bis int.MaxValue. Ein decimal kann weit größere Werte darstellen. Die direkte Konvertierung eines Werts außerhalb des Bereichs löst OverflowException aus; sie begrenzt ihn nicht auf den nächsten Endpunkt.
Erwarten Sie solche Eingaben, validieren Sie vor der Konvertierung oder fangen Sie OverflowException an der Eingangsgrenze ab. Casten Sie Geld nicht stillschweigend, damit es in eine API passt: Wählen Sie einen breiteren Typ oder behalten Sie decimal, wenn der Vertrag dies erlaubt. Eine geprüfte Konvertierung hilft, wenn der schmale Typ gewollt ist und Überlauf beim Test sichtbar sein soll.
Die Konvertierung passend zur Regel auswählen
| Beabsichtigtes Ergebnis | Verwenden | Wichtiges Verhalten |
|---|---|---|
| Bruchteil verwerfen | (int)value |
Schneidet Richtung null ab. |
Nächstes int |
Convert.ToInt32(value) |
Mittelwerte werden zur geraden Zahl gerundet. |
| Immer niedriger oder höher | Math.Floor oder Math.Ceiling, dann casten |
Bei negativen Werten anders als Abschneiden. |
| Eigene Mittelwertregel | Math.Round mit MidpointRounding, dann casten |
Gleichstandsregel ausdrücklich angeben. |
Für gewöhnliches Abschneiden ist der explizite Cast die knappe Empfehlung. Wählen Sie Convert.ToInt32 oder eine Math-Methode nur, wenn deren Rundungsregel die beabsichtigte Regel ist, und berücksichtigen Sie am int-Grenzwert immer OverflowException.