Tipi numerici a virgola mobile (riferimento a C#)
I tipi numerici a virgola mobile rappresentano numeri reali. Tutti i tipi numerici a virgola mobile sono tipi di valore. Sono anche tipi semplici e possono essere inizializzati con valori letterali . Tutti i tipi numerici a virgola mobile supportano operatori aritmetici, confrontoe di uguaglianza.
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 passerebbe inosservata a tutte le applicazioni, tranne a quelle più intensive in termini 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 il tipo
double
nell'espressione, l'espressione si valuta adouble
, o abool
nei confronti relazionali e di uguaglianza. - Se non c'è alcun tipo
double
nell'espressione, essa viene valutata comefloat
, oppure comebool
nei confronti 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 decimal
o a bool
nei confronti relazionali e di uguaglianza.
Non è possibile combinare il tipo di decimal
con i tipi float
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 tipo di un valore letterale reale è determinato dal relativo suffisso come indicato di seguito:
- Il valore letterale senza suffisso o con il suffisso
d
oD
è di tipodouble
- Il valore letterale con il suffisso
f
oF
è di tipofloat
- Il valore letterale con il suffisso
m
oM
è di tipodecimal
Il codice seguente illustra un esempio di ognuno di essi:
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, ovvero specificare 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 di virgola mobile in qualsiasi altro tipo di virgola mobile con 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# :