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 tilldouble
, eller tillbool
i relations- och likhetsjämförelser. - Om det inte finns någon
double
typ i uttrycket utvärderas uttrycket tillfloat
eller tillbool
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 decimal
eller 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
ellerD
är av typendouble
- Literalen med suffixet
f
ellerF
är av typenfloat
- Literalen med suffixet
m
ellerM
ä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: