Come usare numeri interi e a virgola mobile in C#

Questa esercitazione illustra i tipi numerici in C#. Si scriveranno piccole quantità di codice, quindi si compilerà ed eseguirà tale codice. L'esercitazione contiene una serie di lezioni che esplorano numeri e operazioni matematiche in C#. Queste lezioni presentano le nozioni fondamentali del linguaggio C#.

Suggerimento

Per incollare un frammento di codice all'interno della modalità di messa a fuoco, è consigliabile usare il tasto di scelta rapida (CTRL + v o cmd + v).

Prerequisiti

L'esercitazione prevede che sia stato configurato un computer per lo sviluppo locale. Vedere Configurare l'ambiente locale per le istruzioni di installazione e una panoramica dello sviluppo di applicazioni in .NET.

Se non si vuole configurare un ambiente locale, vedere la versione interattiva in-browser di questa esercitazione.

Esplorare le operazioni matematiche su interi

Creare una directory denominata numbers-quickstart. Renderla la directory corrente ed eseguire il comando seguente:

dotnet new console -n NumbersInCSharp -o .

Importante

I modelli C# per .NET 6 usano istruzioni di primo livello. L'applicazione potrebbe non corrispondere al codice in questo articolo, se è già stato eseguito l'aggiornamento a .NET 6. Per altre informazioni, vedere l'articolo sui nuovi modelli C# genera istruzioni di primo livello

.NET 6 SDK aggiunge anche un set di direttive impliciteglobal using per i progetti che usano gli SDK seguenti:

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

Queste direttive implicite global using includono gli spazi dei nomi più comuni per il tipo di progetto.

Per altre informazioni, vedere l'articolo sull'uso implicito delle direttive

Aprire Program.cs nell'editor preferito e sostituire il contenuto del file con il codice seguente:

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

Eseguire questo codice digitando dotnet run nella finestra di comando.

Sono state visualizzate una delle operazioni matematiche fondamentali con numeri interi. Il int tipo rappresenta un numero intero, zero, positivo o intero negativo. Per l'addizione si usa il simbolo +. Altre operazioni matematiche comuni per gli interi includono:

  • - per la sottrazione
  • * per la moltiplicazione
  • / per la divisione

Per iniziare, esplorare le diverse operazioni. Aggiungere queste righe dopo quella indicante il valore di c:

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

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

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

Eseguire questo codice digitando dotnet run nella finestra di comando.

È anche possibile sperimentare scrivendo più operazioni matematiche nella stessa riga, se si vuole. Provare, esempio, c = a + b - 12 * 17;. È consentita la combinazione di variabili e numeri costanti.

Suggerimento

Mentre si impara a usare C# (o qualsiasi linguaggio di programmazione) sicuramente si commetteranno errori durante la scrittura del codice. Il compilatore troverà questi errori e li segnalerà. Quando l'output contiene messaggi di errore, esaminare attentamente il codice di esempio e il codice nella finestra per scoprire che cosa correggere. Questo esercizio sarà utile per imparare la struttura del codice C#.

Il primo passaggio è stato completato. Prima di iniziare la sezione successiva, spostare il codice corrente in un metodo separato. Un metodo è una serie di istruzioni raggruppate e date un nome. Si chiama un metodo scrivendo il nome del metodo seguito da (). L'organizzazione del codice in metodi semplifica l'uso di un nuovo esempio. Al termine, il codice dovrebbe essere simile al seguente:

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);
}

La riga WorkWithIntegers(); richiama il metodo. Il codice seguente dichiara il metodo e lo definisce.

Esplorare l'ordine delle operazioni

Impostare come commento la chiamata a WorkingWithIntegers(). L'output risulterà in questo modo meno disordinato quando si usa questa sezione:

//WorkWithIntegers();

// avvia un commento in C#. Un commento è un testo che si vuole conservare nel codice sorgente senza eseguirlo come codice. Il compilatore non genera codice eseguibile dai commenti. Poiché WorkWithIntegers() è un metodo, è necessario aggiungere un commento solo a una riga.

Il linguaggio C# stabilisce un ordine di precedenza per le diverse operazioni matematiche, con regole coerenti con quelle della matematica. La moltiplicazione e la divisione hanno la precedenza rispetto ad addizione e sottrazione. Esplorare questa operazione aggiungendo il codice seguente dopo la chiamata a WorkWithIntegers()ed eseguendo dotnet run:

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

L'output dimostra che la moltiplicazione viene eseguita prima dell'addizione.

È possibile forzare un ordine diverso per le operazioni racchiudendo tra parentesi l'operazione o le operazioni che si vuole eseguire per prime. Aggiungere le righe seguenti e ripetere l'esecuzione:

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

Sperimentare ulteriormente combinando molte operazioni diverse. Aggiungere un elemento simile alle righe seguenti. Provare di nuovo dotnet run.

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

È possibile che si sia notato un comportamento interessante per gli interi. La divisione di interi genera sempre un risultato intero, anche quando ci si aspetta che il risultato includa una parte decimale o frazionaria.

Se questo comportamento non è stato visualizzato, provare il codice seguente:

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

Digitare di nuovo dotnet run per visualizzare i risultati.

Prima di continuare, tutto il codice scritto in questa sezione verrà inserito in un nuovo metodo. Chiamare il nuovo metodo OrderPrecedence. Il codice dovrebbe essere simile al seguente:

// 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);
}

Esplorare la precisione e i limiti delle operazioni su interi

L'ultimo esempio dimostra che la divisione di interi tronca il risultato. È possibile ottenere il resto usando l'operatore modulo, ovvero il carattere %. Provare il codice seguente dopo la chiamata al metodo a 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}");

Il tipo integer in C# è diverso dagli interi matematici per un altro aspetto, ovvero per il tipo int esistono limiti minimi e massimi. Aggiungere questo codice per visualizzare tali limiti:

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

Se un calcolo produce un valore che supera questi limiti, si genera una condizione di underflow o overflow. La risposta sembra proseguire da un limite all'altro. Aggiungere queste due righe per visualizzare un esempio:

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

Si noti che la risposta è molto vicina all'intero minimo (negativo). È uguale a min + 2. L'operazione di addizione ha causato l'overflow dei valori consentiti per gli interi. La risposta è un numero negativo molto grande, poiché un overflow "ritorna a capo" proseguendo dal valore intero più grande possibile a quello più piccolo.

Esistono altri tipi numerici con limiti e precisione diversi che è possibile usare quando il tipo int non soddisfa le proprie esigenze. Di seguito verranno esaminati gli altri tipi. Prima di iniziare la sezione successiva, spostare il codice scritto in questa sezione in un metodo separato. Assegnare all'elemento il nome TestLimits.

Usare il tipo double

Il tipo numerico double rappresenta un numero a virgola mobile a precisione doppia. Questi termini potrebbero risultare sconosciuti. Un numero a virgola mobile è utile per rappresentare numeri non integrali, con ordine di grandezza molto grande o molto piccolo. La precisione doppia è un termine relativo che descrive il numero di cifre binarie usate per archiviare il valore. I numeri di precisione doppia hanno due volte il numero di cifre binarie come precisione singola. Nei computer moderni, è più comune usare la precisione doppia rispetto ai singoli numeri di precisione. I numeri di precisione singola vengono dichiarati usando la float parola chiave. Per iniziare a esplorare questo tipo, Aggiungere il codice seguente e visualizzare il risultato:

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

Si noti che la risposta include la parte decimale del quoziente. Provare ora un'espressione leggermente più complessa con valori double:

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

L'intervallo di un valore double è molto maggiore rispetto ai valori integer. Provare il codice seguente sotto il codice già scritto finora:

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

Questi valori vengono stampati nella notazione scientifica. Il numero a sinistra di E rappresenta il significando. Il numero a destra è l'esponente, come potenza di 10. Come per i numeri decimali in matematica, i valori double in C# possono presentare errori di arrotondamento. Provare questo codice:

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

Si sa che il 0.3 numero finito di volte ripetuto non è esattamente lo stesso di 1/3.

Sfida

Provare altri calcoli con numeri di grandi dimensioni, numeri piccoli, moltiplicazione e divisione usando il double tipo. Provare calcoli più complessi. Dopo avere dedicato un po' di tempo all'esercizio, inserire il codice scritto in un nuovo metodo. Denominare il nuovo metodo WorkWithDoubles.

Usare i tipi decimali

Sono già stati presentati i tipi numerici di base in C#, ovvero integer e double. C'è un altro tipo per imparare: il decimal tipo. Il tipo decimal ha un intervallo più piccolo, ma maggiore precisione di double. Per verificarlo, eseguire questa procedura:

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

Si noti che l'intervallo è minore rispetto al tipo double. Per vedere la maggiore precisione del tipo decimal, provare il codice seguente:

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

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

Il suffisso M nei numeri è il modo in cui si indica che una costante deve usare il tipo decimal. In caso contrario, il compilatore presuppone il double tipo.

Nota

La lettera M è stata scelta come lettera più visivamente distinta tra le double parole chiave e decimal .

Si noti che le operazioni matematiche con il tipo decimal includono più cifre a destra del separatore decimale.

Sfida

Dopo aver esaminato i diversi tipi numerici, scrivere codice che calcola l'area di un cerchio con raggio di 2,5 cm. Ricordarsi che l'area di un cerchio si calcola moltiplicando il quadrato del raggio per Pi greco. Suggerimento: .NET contiene una costante per Pi greco, Math.PI, che è possibile usare per tale valore. Math.PI, come tutte le costanti dichiarate nello System.Math spazio dei nomi, è un double valore. Per questo motivo, è consigliabile usare double anziché decimal i valori per questa sfida.

Si otterrà una risposta compresa tra 19 e 20. È possibile controllare la risposta esaminando il codice di esempio completato in GitHub.

È anche possibile provare alcune altre formule.

È stata completata la guida introduttiva "Numeri in C#". È possibile continuare con la guida introduttiva Rami e cicli nel proprio ambiente di sviluppo.

Per altre informazioni sui numeri in C#, vedere gli articoli seguenti: