TOC

This article is currently in the process of being translated into Italian (~99% done).

Tipi di dati:

Floating points

I numeri Floating-point sono numeri che hanno parti frazionarie (di solito espresse con punti decimali). Potresti chiederti perché non si utilizzi unicamente un singolo data-type numerico quando si ha a che fare con i numeri in generale (cioè, che siano frazionari o non), tuttavia bisogna sapere che questo avviene perché è molto più veloce per il computer avere a che fare con numeri interi (senza frazioni) che con quelli contenenti frazioni. Per questo motivo ha senso avere una distinzione fra i due data-type numerici. Una buona regola è: se sai di aver a che fare con numeri interi, allora utilizza "int" come data-type numerico; altrimenti, utilizza uno dei data-type a virgola mobile (float) descritti in questo articolo. Da ricordare che "floating-point" tradotto significa propriamente "virgola mobile".

Utilizzare un valore a virgola mobile è tanto facile quanto utilizzare un intero, anche se c'è qualche piccola accortezza da tenere in mente quando utilizziamo i valori a virgola mobile; di questo ne discuteremo in seguito. Per il momento, diamo un'occhiata a cosa succede quando utilizziamo uno dei data-type a virgola mobile più utilizzati: il double.

double number;

Esattamente come per i valori interi, anche per questi puoi assegnarne il valore quando lo dichiari:

double number = 42.0;

Lo stesso vale per i tipi float e decimal, ne discuteremo fra un secondo, qui la notazione è leggermente diversa:

double doubleVal = 42.0;
float floatVal = 42.0f;
decimal decimalVal = 42.0m;

Nota come abbiamo inserito la "f" e la "m" dopo i numeri rispettivamente per il float e per il decimal. Questo fa capire al compilatore che gli stiamo assegnando un valore float o decimal. Questo è importante da tenere in mente perché senza di essi C# li interpreterà automaticamente come double: non dimenticartene!

float, double o decimal?

Utilizzare numeri a virgola mobile in programmazione ha sempre causato tante questioni e preoccupazioni. Per esempio, C# ha almeno tre data-type per trattare i numeri frazionari (non interi):

  • float (un alterego per System.Single)
  • double (un alterego per System.Double)
  • decimal (un alterego per System.Decimal)

La differenza alla radice può essere difficile da capire, a meno che non si ha un sacco di conoscenza su come i computer funzionano internamente. Quindi restiamo su cose più pratiche.

Generalmente, tutta la differenza fra i tipi float, double e decimal sta esclusivamente nella precisione di calcolo, e quindi sull'uso di memoria utilizzata a immagazzinare i valori. Il tipo float è il "meno dispendioso" in termini di memoria: può rappresentare numeri fino a 7 cifre; Il tipo double è già più preciso rispetto a float: può rappresentare numeri fino a 16 cifre; Il tipo decimal è il più preciso di tutti ma è per questo anche il più dispendioso in termini di memoria: può rappresentare numeri fino a 29 cifre.

Potresti chiederti a cosa serva tutta questa precisione di calcolo, beh, la risposta è "cose di matematica". Il classico esempio che si fa per farne capire la differenza è quello di dividere il 10 per 3. Molti faranno il calcolo in mente e diranno che il risultato è 3.33, ma molte altre persone sanno che in realtà questa non si tratta di una risposta accurata. Sì, la vera risposta è 3.33... ma seguito da molti altri 3 - quanti? Beh, questo è C# a deciderlo sulla base del data-type che abbiamo scelto. Dai un'occhiata a questo esempio

float a = 10f / 3;
Console.WriteLine(a);
double b = 10d / 3;
Console.WriteLine(b);
decimal c = 10m / 3;
Console.WriteLine(c);

Stesso calcolo, con diversi tipi di dati. Il risultato è il seguente:

a: 3.333333
b: 3.33333333333333
c: 3.3333333333333333333333333333

La differenza è abbastanza evidente, ma di quanta precisione abbiamo realmente bisogno per la maggior parte dei compiti?

Come scegliere

Per prima cosa, considera quante cifre hai bisogno di immagazzinare. Una variabile float può contenerne "solo" 7, quindi se hai bisogno di un numero più grande di questo, allora dovrai utilizzare il tipo double o addirittura il decimal.

In secondo luogo, entrambe le variabili float e double rappresentano valori approssimati del valore reale - in altre parole, potrebbe non essere esatto sulle ultime cifre. Questo significa che una volta che inizi a fare più e più calcoli con queste variabili, potrebbero non essere più precise, il ciò significa che i due valori che dovebbero essere uguali potrebbero non esserlo più.

Quindi, per situazioni dove per te la precisione rappresenta la preoccupazione primaria, allora dovresti utilizzare il tipo decimal. Un ottimo esempio è il rappresentare numeri finanziari (soldi): scommetto che non vorresti aggiungere 10 valori alla tua contabilità solo per poi scoprire che i risultati non sono quelli che ti aspettavi. In questo caso (proprio perché c'è di mezzo il contabile) la precisione è importante. Se, invece, le prestazioni sono per te più importanti, allora dovresti usare float (adatto per i numeri piccoli) o anche double (adatto per numeri mediamente più grandi). La variabile decimal è, per via della sua precisione aggiuntiva, molto più lenta della variabile float e... alcuni test mostrano che può essere più lenta anche di 20 volte!

Sommario

Quando si lavora con numeri a virgola mobile, dovresti usare le variabili float o double quando la precisione è meno importante delle prestazioni. D'altro canto, se vuoi la massima precisione e sei disposto ad accettare livelli minori di prestazioni, dovresti utilizzare la variabile decimal - specialmente in caso di numeri finanziari.

Se vuoi sapere di più sulla base della differenza fra questi tipi di dati, o altri dettagli, dovresti guardare quest'articolo molto dettagliato :What Every Computer Scientist Should Know About Floating-Point Arithmetic


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!