Freigeben über


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 doublekonvertiert. 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 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 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 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:

Weitere Informationen