Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I tipi numerici a virgola mobile rappresentano numeri reali. Tutti i tipi numerici a virgola mobile sono tipi di valore. Sono anche tipi semplici ed è possibile inizializzarli usando valori letterali. Tutti i tipi numerici a virgola mobile supportano operatori aritmetici, confrontoe di uguaglianza.
Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle anteprime pubbliche per la versione futura del linguaggio.
La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.
Suggerimento
Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.
Caratteristiche dei tipi a virgola mobile
C# supporta i tipi a virgola mobile predefiniti seguenti:
| Tipo/parola chiave C# | Intervallo approssimativo | Precisione | Grandezza | Tipo .NET |
|---|---|---|---|---|
float |
±1,5 x 10−45 a ±3,4 x 1038 | ~6-9 cifre | 4 byte | System.Single |
double |
±5,0 × 10−324 a ±1,7 × 10308 | ~15-17 cifre | 8 byte | System.Double |
decimal |
±1.0 x 10-28 a ±7.9228 x 1028 | 28-29 cifre | 16 byte | System.Decimal |
Nella tabella precedente ogni parola chiave di tipo C# dalla colonna all'estrema sinistra è un alias per il tipo .NET corrispondente. Sono intercambiabili. Ad esempio, le dichiarazioni seguenti dichiarano variabili dello stesso tipo:
double a = 12.3;
System.Double b = 12.3;
Il valore predefinito di ciascun tipo numerico a virgola mobile è zero, 0. Ognuno dei tipi a virgola mobile ha le costanti MinValue e MaxValue che forniscono il valore finito minimo e massimo di tale tipo. I tipi float e double forniscono anche costanti che rappresentano valori non numerici e infinito. Ad esempio, il tipo di double fornisce le costanti seguenti: Double.NaN, Double.NegativeInfinitye Double.PositiveInfinity.
Il tipo decimal è appropriato quando il grado di precisione richiesto è determinato dal numero di cifre a destra del separatore decimale. Tali numeri sono comunemente utilizzati nelle applicazioni finanziarie, per gli importi di valuta (ad esempio, $ 1,00), tassi di interesse (ad esempio, 2,625%) e così via. Anche i numeri precisi per una sola cifra decimale vengono gestiti in modo più accurato dal tipo di decimal: 0,1, ad esempio, possono essere rappresentati esattamente da un'istanza di decimal, mentre non esiste alcuna double o float istanza che rappresenta esattamente 0,1. A causa di questa differenza nei tipi numerici, possono verificarsi errori di arrotondamento imprevisti nei calcoli aritmetici quando si usano double o float per i dati decimali. È possibile usare double anziché decimal quando l'ottimizzazione delle prestazioni è più importante rispetto a garantire l'accuratezza. Tuttavia, qualsiasi differenza nelle prestazioni non viene rilevata da tutte le applicazioni, ma con maggiore utilizzo di calcolo. Un altro possibile motivo per evitare decimal consiste nel ridurre al minimo i requisiti di archiviazione. Ad esempio, ML.NET usa float perché la differenza tra 4 byte e 16 byte incide sui set di dati molto grandi. Per altre informazioni, vedere System.Decimal.
È possibile combinare tipi di integrali e i tipi float e double in un'espressione. In questo caso, i tipi integrali vengono convertiti in modo implicito in uno dei tipi a virgola mobile e, se necessario, il tipo float viene convertito in modo implicito in double. L'espressione viene valutata come segue:
- Se è presente un
doubletipo nell'espressione, l'espressione restituiscedoubleo inboolconfronti relazionali e di uguaglianza. - Se nell'espressione non è presente alcun
doubletipo, l'espressione restituiscefloato inboolconfronti relazionali e di uguaglianza.
È anche possibile combinare tipi integrali e il tipo decimal in un'espressione. In questo caso, i tipi integrali vengono convertiti implicitamente nel tipo decimal e l'espressione valuta decimalo a bool nei confronti relazionali e di uguaglianza.
Non è possibile combinare il decimal tipo con i float tipi e double in un'espressione. In questo caso, se si desidera eseguire operazioni aritmetiche, di confronto o di uguaglianza, è necessario convertire in modo esplicito gli operandi da o nel tipo decimal, come illustrato nell'esempio seguente:
double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);
È possibile usare stringhe di formato numerico standard o stringhe di formato numerico personalizzate per formattare un valore a virgola mobile.
Valori letterali reali
Il suffisso su un valore letterale reale determina il tipo:
- Un valore letterale senza un suffisso o con il
dsuffisso oDè undoubleoggetto . - Un valore letterale con il
fsuffisso oFè un oggettofloat. - Un valore letterale con il
msuffisso oMè un oggettodecimal.
Il codice seguente illustra un esempio di ogni tipo:
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;
Nell'esempio precedente viene illustrato anche l'uso di _ come separatore di cifre . È possibile usare il separatore di cifre con tutti i tipi di valori letterali numerici.
È anche possibile usare la notazione scientifica, che specifica una parte esponente di un valore letterale reale, come illustrato nell'esempio seguente:
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
Conversioni
Esiste una sola conversione implicita tra tipi numerici a virgola mobile: da float a double. Tuttavia, è possibile convertire qualsiasi tipo a virgola mobile in qualsiasi altro tipo a virgola mobile usando il cast esplicito. Per ulteriori informazioni, vedere conversioni numeriche integrate.
Specifica del linguaggio C#
Per altre informazioni, vedere le sezioni seguenti della specifica del linguaggio C# :