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.NET float, 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 in double oder in relationalen Vergleichen oder Vergleichen auf Gleichheit in bool ausgewertet.
  • Wenn der double-Typ im Ausdruck vorhanden ist, wird der Ausdruck in float oder in relationalen Vergleichen oder Vergleichen auf Gleichheit in bool 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 oder D ist vom Typ double.
  • Das Literal mit dem Suffix f oder F ist vom Typ float.
  • Das Literal mit dem Suffix m oder M ist vom Typ decimal.

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, das ab C# 7.0 unterstützt wird. 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:

Siehe auch