Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die numerischen Gleitkommatypen stellen reelle Zahlen dar. Alle numerischen Gleitkommatypen sind Werttypen. Sie sind auch einfache Typen, und Sie können sie mithilfe von Literalen initialisieren. Alle numerischen Gleitkommatypen unterstützen arithmetic-, comparison- und equality-Operatoren.
Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie erste Dokumentation für Features in der öffentlichen Vorschau für die kommende Sprachversion.
In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.
Tipp
Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.
Merkmale der Gleitkommatypen
C# unterstützt die folgenden vordefinierten Gleitkommatypen:
| C#-Typ/Schlüsselwort | Ungefährer Bereich | Präzision | Size | .NET-Typ |
|---|---|---|---|---|
float |
±1,5 x 10−45 bis ±3,4 x 1038 | ~6–9 Stellen | 4 Byte | System.Single |
double |
±5.0 × 10−324 bis ±1,7 × 10308 | ~15–17 Stellen | 8 Byte | System.Double |
decimal |
±1.0 × 10-28 to ±7.9228 × 1028 | 28-29 Stellen | 16 Bytes | System.Decimal |
In der vorherigen Tabelle ist jedes C#-Typ-Schlüsselwort aus der spalte ganz links ein Alias für den entsprechenden .NET-Typ. Sie sind austauschbar. Die folgenden Deklarationen deklarieren beispielsweise Variablen desselben Typs:
double a = 12.3;
System.Double b = 12.3;
Der Standardwert jedes Gleitkommatyps ist null, 0. Die einzelnen Gleitkommatypen verfügen jeweils über die Konstanten MinValue und MaxValue, die den minimalen und maximalen Endwert des Typs angeben. Die Typen float und double verfügen auch über Konstanten, die nicht numerische Werte und Unendlichkeitswerte darstellen. Der typ double stellt beispielsweise die folgenden Konstanten bereit: Double.NaN, Double.NegativeInfinityund Double.PositiveInfinity.
Der decimal Typ ist geeignet, wenn der erforderliche Genauigkeitsgrad durch die Anzahl der Ziffern rechts vom Dezimalkomma bestimmt wird. Solche Zahlen werden häufig in Finanzanwendungen verwendet, für Währungsbeträge (z. B. 1,00 $), Zinssätze (z. B. 2,625%) usw. Auch Zahlen, die auf eine Dezimalstelle genau sind, werden durch den Typ decimal genauer dargestellt: 0,1 kann beispielsweise genau durch eine Instanz von decimal dargestellt werden, während es keine Instanz von double oder float gibt, die genau 0,1 darstellt. Aufgrund dieses Unterschieds bei numerischen Typen können unerwartete Rundungsfehler bei arithmetischen Berechnungen auftreten, wenn Sie double oder float für Dezimaldaten verwenden. Sie können double anstelle von decimal verwenden, wenn die Optimierung der Leistung wichtiger als die Genauigkeit ist. Allerdings ist jeder Unterschied bei der Leistung von allen, aber den meisten berechnungsintensiven Anwendungen unbemerkt. Ein weiterer möglicher Grund, decimal zu vermeiden, besteht darin, die Speicheranforderungen zu minimieren. Beispielsweise verwendet ML.NETfloat, da sich die Differenz zwischen 4 Bytes und 16 Bytes bei sehr großen Datensätzen summiert. Weitere Informationen finden Sie unter System.Decimal.
Sie können integrale Typen sowie die Typen float und double in einem Ausdruck kombinieren. In diesem Fall werden integrale Typen implizit in einen der Gleitkommatypen konvertiert, und bei Bedarf wird der float Typ implizit in doublekonvertiert. Der Ausdruck wird wie folgt ausgewertet:
- Wenn ein Typ im Ausdruck vorhanden ist
double, wird der Ausdruck alsdoubleoderboolin relationalen und Gleichheitsvergleichen ausgewertet. - Wenn kein Typ im Ausdruck vorhanden ist
double, wird der Ausdruck alsfloatoderboolin relationalen und Gleichheitsvergleichen ausgewertet.
Sie können auch integrale Typen und den decimal Typ in einem Ausdruck kombinieren. In diesem Fall werden integrale Typen implizit in den decimal-Typ konvertiert, und der Ausdruck wird als decimal oder bool in relationalen Vergleichen und Gleichheitsvergleichen ausgewertet.
Sie können den decimal Typ nicht mit den float Typen double in einem Ausdruck kombinieren. Wenn Sie in diesem Fall arithmetische, Vergleichs- oder Gleichheitsoperationen ausführen möchten, müssen Sie die Operanden explizit vom oder zum Typ decimal konvertieren, wie im folgenden Beispiel gezeigt:
double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);
Zum Formatieren eines Gleitkommawerts können Sie standardmäßige Zahlenformatzeichenfolgen oder benutzerdefinierte Zahlenformatzeichenfolgen verwenden.
Real-Literale
Das Suffix für ein reales Literal bestimmt seinen Typ:
- Ein Literal ohne Suffix oder mit dem
dDSuffix ist eindouble. - Ein Literal mit dem
fOderFSuffix ist einfloat. - Ein Literal mit dem
mOderMSuffix ist eindecimal.
Der folgende Code zeigt ein Beispiel für jeden Typ:
double d = 3D;
d = 4d;
d = 3.934_001;
float f = 3_000.5F;
f = 5.4f;
decimal myMoney = 3_000.5m;
myMoney = 400.75M;
Das vorherige Beispiel zeigt auch die Verwendung von _ als Zifferntrennzeichen. Sie können das Zifferntrennzeichen mit allen Arten numerischer Literale verwenden.
Sie können auch wissenschaftliche Schreibweise verwenden, die einen exponenten Teil eines echten Literals angibt, wie im folgenden Beispiel gezeigt:
double d = 0.42e2;
Console.WriteLine(d); // output 42
float f = 134.45E-2f;
Console.WriteLine(f); // output: 1.3445
decimal m = 1.5E6m;
Console.WriteLine(m); // output: 1500000
Umwandlungen
Es gibt nur eine implizite Konvertierung zwischen numerischen Gleitkommatypen: von float zu double. Sie können jedoch jeden Gleitkommatyp in einen anderen Gleitkommatyp konvertieren, indem Sie die explizite Umwandlung verwenden. Weitere Informationen finden Sie unter Integrierte numerische Konvertierungen (C#-Referenz) (Integrierte numerische Konvertierungen).
C#-Sprachspezifikation
Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation: