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 | Genauigkeit | Größe | .NET-Typ |
---|---|---|---|---|
float |
±1.5 × 10−45 zu ±3.4 × 1038 | ~6–9 Stellen | 4 Bytes | System.Single |
double |
±5,0 × 10−324 bis ±1,7 × 10308 | ~15–17 Stellen | 8 Bytes | System.Double |
decimal |
±1.0 × 10-28 to ±7.9228 × 1028 | 28-29 Stellen | 16 Bytes | System.Decimal |
In der obigen Tabelle ist jedes C#-Typschlüsselwort aus der äußerst linken Spalte ein Alias für den entsprechenden .NET-Typ. Sie können synonym verwendet werden. In den folgenden Deklarationen werden beispielsweise Variablen des gleichen Typs deklariert:
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
verfügt beispielsweise über folgende Konstanten: Double.NaN, Double.NegativeInfinity und Double.PositiveInfinity.
Der decimal
-Typ ist geeignet, wenn der erforderliche Genauigkeitsgrad durch die Anzahl der Ziffern rechts vom Dezimaltrennzeichen bestimmt wird. Solche Zahlen werden häufig in Finanzanwendungen, für Währungsbeträge (z. B. $1,00), bei Zinssätzen (z. B. 2,625 %) usw. verwendet. Gerade Zahlen, die nur auf eine Dezimalstelle genau sind, werden vom decimal
-Typ genauer behandelt: 0,1 kann z. B. durch eine decimal
-Instanz genau dargestellt werden, während keine double
- oder float
-Instanz 0,1 genau darstellt. Aufgrund dieses Unterschieds bei numerischen Typen können unerwartete Rundungsfehler in 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 ist, als die Genauigkeit sicherzustellen. 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, ist das Minimieren der Speicheranforderungen. Beispielsweise verwendet ML.NETfloat
, da der Unterschied zwischen 4 Bytes und 16 Bytes bei sehr großen Datasets ins Gewicht fällt. 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. 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 integrale Typen und den decimal
-Typ auch in einem Ausdruck miteinander 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.
In einem Ausdruck können Sie den decimal
-Typ nicht mit den Typen float
und double
kombinieren. Wenn Sie aber einen arithmetischen Vorgang, einen Vergleich oder einen Gleichheitsvorgang durchführen möchten, müssen Sie, wie nachfolgend dargestellt, in diesem Fall die Operanden explizit aus dem oder in den decimal
-Typ konvertieren
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 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 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
Konvertierungen
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: