Condividi tramite


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 a double, o a bool nei confronti relazionali e di uguaglianza.
  • Se non c'è alcun tipo double nell'espressione, essa viene valutata come float, oppure come bool 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 decimalo 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 o D è di tipo double
  • Il valore letterale con il suffisso f o F è di tipo float
  • Il valore letterale con il suffisso m o M è di tipo decimal

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# :

Vedere anche