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 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 float, eller till bool 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 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 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