Dela via


Numeriska typer av flyttalspunkter (C#-referens)

De numeriska flyttalstyperna representera verkliga tal. Alla flyttalstyper är värdetyper. De är också enkla typer och kan initieras med hjälp av literaler. Alla numeriska typer av flyttalser stöder aritmetiska, jämförelseoch likhet operatorer.

Egenskaper för flyttalstyperna

C# stöder följande fördefinierade flyttalstyper:

C#-typ/nyckelord Ungefärligt intervall Precision Storlek .NET-typ
float ±1,5 x 10−45 till ±3,4 x 1038 ~6–9 siffror 4 byte System.Single
double ±5.0 × 10−324 till ±1,7 × 10308 ~15–17 siffror 8 byte System.Double
decimal ±1,0 x 10-28 till ±7,9228 x 1028 28–29 siffror 16 byte System.Decimal

I föregående tabell är varje C#-typnyckelord från kolumnen längst till vänster ett alias för motsvarande .NET-typ. De är utbytbara. Följande deklarationer deklarerar till exempel variabler av samma typ:

double a = 12.3;
System.Double b = 12.3;

Standardvärdet för varje flyttalstyp är noll, 0. Var och en av flyttalstyperna har konstanterna MinValue och MaxValue som ger det minsta och högsta finita värdet för den typen. Typerna float och double ger också konstanter som representerar värden som inte är ett tal och oändlighet. Typen double innehåller till exempel följande konstanter: Double.NaN, Double.NegativeInfinityoch Double.PositiveInfinity.

Den decimal typen är lämplig när den nödvändiga precisionsgraden bestäms av antalet siffror till höger om decimaltecknet. Sådana tal används ofta i finansiella program, för valutabelopp (till exempel 1,00 USD), räntor (till exempel 2,625%) och så vidare. Även tal som är exakta till endast en decimal hanteras mer korrekt av den decimal typen: 0,1 kan till exempel exakt representeras av en decimal instans, medan det inte finns någon double eller float instans som exakt representerar 0,1. På grund av den här skillnaden i numeriska typer kan oväntade avrundningsfel inträffa i aritmetiska beräkningar när du använder double eller float för decimaldata. Du kan använda double i stället för decimal när det är viktigare att optimera prestanda än att säkerställa noggrannhet. Alla prestandaskillnader skulle dock gå obemärkt förbi alla utom de mest beräkningsintensiva programmen. En annan möjlig orsak till att undvika decimal är att minimera lagringskraven. Till exempel använder ML.NETfloat eftersom skillnaden mellan 4 byte och 16 byte läggs till för mycket stora datamängder. Mer information finns i System.Decimal.

Du kan blanda integral typer och typerna float och double i ett uttryck. I det här fallet konverteras integraltyper implicit till någon av flyttalstyperna och vid behov konverteras den float typen implicit till double. Uttrycket utvärderas på följande sätt:

  • Om det finns double typ i uttrycket utvärderas uttrycket till double, eller till bool i relations- och likhetsjämförelser.
  • Om det inte finns någon double typ i uttrycket utvärderas uttrycket till floateller till bool i relations- och likhetsjämförelser.

Du kan också blanda integraltyper och decimal typ i ett uttryck. I det här fallet konverteras integraltyper implicit till den decimal typen och uttrycket utvärderas till decimaleller till bool i relations- och likhetsjämförelser.

Du kan inte blanda decimal typen med float- och double-typerna i ett uttryck. Om du i det här fallet vill utföra aritmetiska åtgärder, jämförelseåtgärder eller likhetsåtgärder måste du uttryckligen konvertera operanderna antingen från eller till decimal typ, som följande exempel visar:

double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);

Antingen kan du använda numeriska standardformatsträngar eller anpassade numeriska formatsträngar för att formatera ett flyttalsvärde.

Verkliga literaler

Typen av en verklig literal bestäms av dess suffix enligt följande:

  • Literalen utan suffix eller med suffixet d eller D är av typen double
  • Literalen med suffixet f eller F är av typen float
  • Literalen med suffixet m eller M är av typen decimal

Följande kod visar ett exempel på var och en:

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;

I föregående exempel visas också användningen av _ som en siffraavgränsare. Du kan använda sifferavgränsaren med alla typer av numeriska literaler.

Du kan också använda vetenskaplig notation, det vill säga ange en exponentdel av en verklig literal, som följande exempel visar:

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

Omvandlingar

Det finns bara en implicit konvertering mellan numeriska flyttalstyper: från float till double. Du kan dock konvertera alla flyttalstyper till andra flyttalstyper med explicita gjutna. För mer information, se inbyggda numeriska konverteringar.

Språkspecifikation för C#

Mer information finns i följande avsnitt i C#-språkspecifikationen:

Se även