Använda heltal och flyttalsnummer i C#

I den här självstudien lär du dig mer om de numeriska typerna i C#. Du kommer att skriva små mängder kod och sedan kompilera och köra koden. Självstudien innehåller en serie lektioner som utforskar siffror och matematiska åtgärder i C#. Under serien får du lära dig grunderna i språket C#.

Tips

Om du vill klistra in ett kodfragment i fokusläget bör du använda kortkommandot (Ctrl + v eller cmd + v).

Förutsättningar

Självstudien förväntar sig att du har en dator konfigurerad för lokal utveckling. Se Konfigurera din lokala miljö för installationsinstruktioner och en översikt över programutveckling i .NET.

Om du inte vill konfigurera en lokal miljö kan du läsa den interaktiva webbläsarversionen av den här självstudien.

Utforska heltalsmatematik

Skapa en katalog med namnet numbers-quickstart. Gör den till den aktuella katalogen och kör följande kommando:

dotnet new console -n NumbersInCSharp -o .

Viktigt

C#-mallarna för .NET 6 använder toppnivåinstruktioner. Ditt program kanske inte matchar koden i den här artikeln om du redan har uppgraderat till .NET 6. Mer information finns i artikeln om nya C#-mallar som genererar instruktioner på toppnivå

.NET 6 SDK lägger också till en uppsättning implicitaglobal using direktiv för projekt som använder följande SDK:er:

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

Dessa implicita global using direktiv innehåller de vanligaste namnrymderna för projekttypen.

Mer information finns i artikeln om implicit användning av direktiv

Öppna Program.cs i din favoritredigerare och ersätt innehållet i filen med följande kod:

int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);

Kör den här koden genom att dotnet run skriva i kommandofönstret.

Du har sett en av de grundläggande matematiska åtgärderna med heltal. Typen int representerar ett heltal, ett nolltal, ett positivt eller negativt heltal. Du använder symbolen + till att addera. Här är några andra vanliga matematiska operationer för integer-värden:

  • - för subtraktion
  • * för multiplikation
  • / för division

Börja med att testa de olika operationerna. Lägg till dessa rader efter raden som skriver värdet cför :

// subtraction
c = a - b;
Console.WriteLine(c);

// multiplication
c = a * b;
Console.WriteLine(c);

// division
c = a / b;
Console.WriteLine(c);

Kör den här koden genom att dotnet run skriva i kommandofönstret.

Du kan också experimentera genom att skriva flera matematiska åtgärder på samma rad, om du vill. Prova c = a + b - 12 * 17; till exempel. Blandning av variabler och konstanta tal tillåts.

Tips

När du utforskar C# (eller något annat språk) och skriver kod kommer du att göra misstag. Kompilatorn kommer att hitta de här felen och rapportera dem till dig. När utdata innehåller felmeddelanden bör du titta närmare på exempelkoden och koden i fönstret för att se vad du ska åtgärda. Sådana övningar hjälper dig att lära dig C#-strukturen.

Du har slutfört det första steget. Innan du börjar nästa avsnitt ska vi flytta den aktuella koden till en separat metod. En metod är en serie instruktioner grupperade tillsammans och med ett namn. Du anropar en metod genom att skriva metodens namn följt av (). Genom att organisera koden i metoder blir det enklare att börja arbeta med ett nytt exempel. När du är klar bör koden se ut så här:

WorkWithIntegers();

void WorkWithIntegers()
{
    int a = 18;
    int b = 6;
    int c = a + b;
    Console.WriteLine(c);


    // subtraction
    c = a - b;
    Console.WriteLine(c);

    // multiplication
    c = a * b;
    Console.WriteLine(c);

    // division
    c = a / b;
    Console.WriteLine(c);
}

Raden WorkWithIntegers(); anropar metoden. Följande kod deklarerar metoden och definierar den.

Utforska operationernas ordning

Kommentera ut anropet till WorkingWithIntegers(). Det gör utdata mindre röriga när du arbetar i det här avsnittet:

//WorkWithIntegers();

Startar // en kommentar i C#. Kommentarer är all text som du vill behålla i källkoden, men som inte körs som kod. Kompilatorn genererar ingen körbar kod från kommentarer. Eftersom WorkWithIntegers() är en metod behöver du bara kommentera ut en rad.

I språket C# definieras olika matematiska operationers prioritet enligt de vanliga regler du lärt dig i matematiken. Multiplikation och division har prioritet framför addition och subtraktion. Utforska det genom att lägga till följande kod efter anropet till WorkWithIntegers()och köra dotnet run:

int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);

Du ser i utdata att multiplikationen utfördes innan additionen.

Du kan framtvinga en annan åtgärdsordning genom att lägga till parenteser kring den åtgärd eller de åtgärder som du vill utföra först. Lägg till följande rader och kör igen:

d = (a + b) * c;
Console.WriteLine(d);

Testa vidare genom att kombinera många olika operatorer. Lägg till något som liknar följande rader. Prova dotnet run igen.

d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);

Du kanske har märkt att integer-värden beter sig lite underligt. Vid division med integer-värden returneras alltid ett annat integer-värde, även när du hade förväntat dig en decimal eller bråkdel i resultatet.

Om du inte har sett det här beteendet kan du prova följande kod:

int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);

Skriv dotnet run igen för att se resultatet.

Innan vi går vidare ska vi ta all kod som du har skrivit i det här avsnittet och placera den i en ny metod. Anropa den nya metoden OrderPrecedence. Koden bör se ut ungefär så här:

// WorkWithIntegers();
OrderPrecedence();

void WorkWithIntegers()
{
    int a = 18;
    int b = 6;
    int c = a + b;
    Console.WriteLine(c);


    // subtraction
    c = a - b;
    Console.WriteLine(c);

    // multiplication
    c = a * b;
    Console.WriteLine(c);

    // division
    c = a / b;
    Console.WriteLine(c);
}

void OrderPrecedence()
{
    int a = 5;
    int b = 4;
    int c = 2;
    int d = a + b * c;
    Console.WriteLine(d);

    d = (a + b) * c;
    Console.WriteLine(d);

    d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
    Console.WriteLine(d);

    int e = 7;
    int f = 4;
    int g = 3;
    int h = (e + f) / g;
    Console.WriteLine(h);
}

Utforska noggrannhet och gränser för integer-värden

I det senaste exemplet såg du att resultatet trunkeras vid division med integer-värden. Du kan hämta resten med hjälp av modulooperatorn , % tecknet. Prova följande kod efter metodanropet till OrderPrecedence():

int a = 7;
int b = 4;
int c = 3;
int d = (a + b) / c;
int e = (a + b) % c;
Console.WriteLine($"quotient: {d}");
Console.WriteLine($"remainder: {e}");

Integer-värden i C# har en annan viktig skillnad jämfört med vanliga heltal i matematiken: typen int har en största och minsta gräns. Lägg till den här koden för att se dessa gränser:

int max = int.MaxValue;
int min = int.MinValue;
Console.WriteLine($"The range of integers is {min} to {max}");

Om en beräkning ger ett värde som ligger utanför de här gränserna uppstår tillstånd med understigande eller överstigande värden. Lösningen verkar vara att låta gränserna gå in i varandra. Lägg till dessa två rader för att se ett exempel:

int what = max + 3;
Console.WriteLine($"An example of overflow: {what}");

Du ser att svaret ligger mycket nära det minsta tillåtna (negativa) integer-värdet. Det är samma resultat som för min + 2. Additionen översteg största tillåtna integer-värde. Svaret är ett mycket stort negativt tal, eftersom värdet gick från att vara det största möjliga integer-värdet till det minsta.

Det finns andra numeriska typer med andra gränser och noggrannhet, som du kan använda när typen int inte passar för det du vill göra. Nu ska vi utforska de andra typerna. Innan du börjar nästa avsnitt flyttar du koden som du skrev i det här avsnittet till en separat metod. Ge den namnet TestLimits.

Arbeta med typen double

Den numeriska typen double representerar ett flyttal med dubbelt så stor noggrannhet. Du kanske inte är bekant med de här termerna. Flyttal används till att representera tal som inte är heltal, och som kan vara mycket stora eller små. Dubbel precision är en relativ term som beskriver antalet binära siffror som används för att lagra värdet. Dubbelprecisionsnummer har dubbelt så många binära siffror som enkel precision. På moderna datorer är det vanligare att använda dubbel precision än enkla precisionsnummer. Enkla precisionsnummer deklareras med nyckelordet float . Vi testar. Lägg till följande kod och se resultatet:

double a = 5;
double b = 4;
double c = 2;
double d = (a + b) / c;
Console.WriteLine(d);

Lägg märke till att svaret innehåller kvotens decimaldel. Testa ett lite mer komplicerat uttryck med tal av typen double:

double e = 19;
double f = 23;
double g = 8;
double h = (e + f) / g;
Console.WriteLine(h);

Intervallet för double-värden är mycket större än för integer-värden. Prova följande kod under det du har skrivit hittills:

double max = double.MaxValue;
double min = double.MinValue;
Console.WriteLine($"The range of double is {min} to {max}");

Dessa värden skrivs ut i vetenskaplig notation. Talet till vänster om E är signifikanden. Talet till höger är exponenten, med 10 som bas. Precis som decimaltal i den vanliga matematiken så kan double-värden i C# ha avrundningsfel. Testa den här koden:

double third = 1.0 / 3.0;
Console.WriteLine(third);

Du vet att 0.3 upprepande ändliga antal gånger inte är exakt samma som 1/3.

Uppgift

Prova andra beräkningar med stora tal, små tal, multiplikation och division med hjälp av double typen . Testa mer komplicerade beräkningar. När du har ägnat lite tid åt uppgiften kan du ta koden som du har skrivit och placera den i en ny metod. Ge den nya metoden WorkWithDoublesnamnet .

Arbeta med decimaltyper

Nu har du sett de grundläggande numeriska typerna i C#: integer- och double-värden. Det finns en annan typ att lära sig: decimal typen . Typen decimal har ett mindre intervall än double, men större noggrannhet. Vi tar en titt:

decimal min = decimal.MinValue;
decimal max = decimal.MaxValue;
Console.WriteLine($"The range of the decimal type is {min} to {max}");

Lägg märke till att intervallet är mindre än för typen double. Du ser den större noggrannheten genom att testa följande kod:

double a = 1.0;
double b = 3.0;
Console.WriteLine(a / b);

decimal c = 1.0M;
decimal d = 3.0M;
Console.WriteLine(c / d);

Du använder suffixet M efter talen till att ange att konstanten ska ha typen decimal. Annars förutsätter double kompilatorn typen.

Anteckning

M Bokstaven valdes som den mest visuellt distinkta bokstaven mellan nyckelorden double och decimal .

Nu ser du att resultatet med typen decimal har fler siffror till höger om decimaltecknet.

Uppgift

Nu när du sett de olika numeriska typerna ska du skriva kod som beräknar arean för en cirkel med radien 2,50 centimeter. Kom ihåg att en cirkels area är radien i kvadrat gånger Pi. En ledtråd: .NET har en konstant för talet Pi, Math.PI, som du kan använda här. Math.PI, liksom alla konstanter som deklareras i System.Math namnområdet, är ett double värde. Därför bör du använda double i stället för decimal värden för den här uppgiften.

Du bör få ett svar mellan 19 och 20. Du kan kontrollera ditt svar genom att titta på den färdiga exempelkoden på GitHub.

Testa några andra formler om du vill.

Du har slutfört snabbstarten "Tal i C#". Du kan fortsätta med snabbstarten Grenar och loopar i din egen utvecklingsmiljö.

Du kan lära dig mer om tal i C# i följande artiklar: