Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 doubletyp i uttrycket utvärderas uttrycket tilldouble, eller tillbooli relations- och likhetsjämförelser.
- Om det inte finns någon doubletyp i uttrycket utvärderas uttrycket tillfloateller tillbooli 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 dellerDär av typendouble
- Literalen med suffixet fellerFär av typenfloat
- Literalen med suffixet mellerMär av typendecimal
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: