Numerische Gleitkommatypen (C#-Referenz)
Die numerischen Gleitkommatypen stellen reelle Zahlen dar. Alle numerischen Gleitkommatypen sind Werttypen. Sie sind auch einfache Typen und können mit Literalen initialisiert werden. Alle numerischen Gleitkommatypen unterstützen arithmetic-, comparison- und equality-Operatoren.
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 würde jeder Unterschied in der Leistung bei allen Anwendungen außer den berechnungsintensivsten unbemerkt bleiben. 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 double
konvertiert. Der Ausdruck wird wie folgt ausgewertet:
- Wenn der
double
-Typ im Ausdruck vorhanden ist, wird der Ausdruck indouble
oder in relationalen Vergleichen oder Vergleichen auf Gleichheit inbool
ausgewertet. - Wenn der
double
-Typ im Ausdruck vorhanden ist, wird der Ausdruck infloat
oder in relationalen Vergleichen oder Vergleichen auf Gleichheit inbool
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 typen float
und 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
Der Typ eines Real-Literals wird wie folgt durch sein Suffix bestimmt:
- Das Literal ohne Suffix oder mit dem Suffix
d
oderD
ist vom Typdouble
. - Das Literal mit dem Suffix
f
oderF
ist vom Typfloat
. - Das Literal mit dem Suffix
m
oderM
ist vom Typdecimal
.
Der folgende Code veranschaulicht ein Beispiel für jede:
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 die wissenschaftliche Notation verwenden, d. h. einen exponentiellen Teil eines Real-Literals angeben, wie das folgende Beispiel zeigt:
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
. Allerdings können Sie einen Gleitkommatyp mit der expliziten Umwandlungin beliebige andere Gleitkommatypen konvertieren. 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: