Numeriska typer av flyttalspunkter (C#-referens)
De numeriska typerna av flyttalser representerar verkliga tal. Alla numeriska typer av flyttalser är värdetyper. De är också enkla typer och kan initieras med literaler. Alla numeriska typer av flyttalser stöder aritmetiska operatorer, jämförelse- och likhetsoperatorer .
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 MinValue
har konstanterna och MaxValue
som ger det minsta och högsta ändliga 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 innehåller till exempel double
följande konstanter: Double.NaN, Double.NegativeInfinityoch Double.PositiveInfinity.
Typen decimal
ä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 decimalsiffra hanteras mer exakt av decimal
typen: 0.1 kan till exempel representeras exakt av en decimal
instans, medan det inte finns någon double
instans 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 anledning att undvika decimal
är att minimera lagringskraven. Till exempel använder float
ML.NET 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 integraltyper och typerna float
och double
i ett uttryck. I det här fallet konverteras integraltyper implicit till någon av flyttalstyperna och vid behov float
konverteras 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
typen i ett uttryck. I det här fallet konverteras integraltyper implicit till decimal
typen och uttrycket utvärderas till decimal
, eller till bool
i relations- och likhetsjämförelser.
Du kan inte blanda decimal
typen med typerna float
och double
i ett uttryck. Om du i det här fallet vill utföra aritmetiska åtgärder, jämförelser eller likhetsåtgärder måste du uttryckligen konvertera operanderna antingen från eller till decimal
typen, som följande exempel visar:
double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);
Du kan använda antingen standardsträngar i numeriskt format 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 sifferavgrä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 explicit gjutning. Mer information finns i Inbyggda numeriska konverteringar.
Språkspecifikation för C#
Mer information finns i följande avsnitt i C#-språkspecifikationen:
Se även
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för