HOWTO · Csharp
Convertire decimal in int in C#
Convertire decimal in int in C# scegliendo tra troncamento, arrotondamento al più vicino o arrotondamento direzionale, e gestire i valori fuori dall’intervallo Int32.
In questa pagina
Usa (int)value quando vuoi eliminare la parte frazionaria. Usa Convert.ToInt32(value) per arrotondare all’intero più vicino e usa un metodo Math quando la regola è direzionale o prevede una politica specifica per i punti medi. Il seguente esempio compatto confronta queste scelte con valori positivi.
using System;
class Program
{
static void Main()
{
decimal value = 12.9m;
Console.WriteLine("cast: " + (int)value);
Console.WriteLine("nearest: " + Convert.ToInt32(12.5m) + ", " + Convert.ToInt32(13.5m));
Console.WriteLine("floor: " + Math.Floor(value));
Console.WriteLine("ceiling: " + Math.Ceiling(value));
Console.WriteLine("away: " + Math.Round(2.5m, MidpointRounding.AwayFromZero));
}
}
cast: 12
nearest: 12, 14
floor: 12
ceiling: 13
away: 3
La politica di conversione è una regola aziendale, non un dettaglio di formattazione. Se la parte frazionaria conserva il suo significato, ad esempio per il denaro o le misure, mantieni il valore come decimal. Ogni conversione finale in int deve inoltre tenere conto dei valori che non rientrano in Int32.
Troncare un decimal verso zero
Il cast esplicito (int)value è la scelta più chiara per il troncamento. Un letterale decimal richiede il suffisso m; senza di esso, un letterale come 12.9 è un double. La conversione da decimal a un tipo intero arrotonda verso zero: (int)12.9m è 12, mentre (int)-12.9m è -12. Non è né un arrotondamento verso il basso né verso l’alto. La documentazione sulle conversioni numeriche di C# descrive il comportamento verso zero e il superamento dell’intervallo.
Arrotondare all’intero più vicino
Convert.ToInt32(decimal) arrotonda all’intero con segno a 32 bit più vicino invece di troncare. Quando la parte frazionaria è esattamente .5, usa l’arrotondamento del punto medio verso il pari: Convert.ToInt32(12.5m) restituisce 12, mentre Convert.ToInt32(13.5m) restituisce 14. È utile per le misure che devono raggiungere l’unità intera più vicina, ma non è la politica corretta quando ogni punto medio deve allontanarsi da zero.
La documentazione dell’overload decimal di Convert.ToInt32 specifica OverflowException per i valori fuori dall’intervallo di int. Il metodo non rende sicuro un decimal troppo grande.
Scegliere una regola di arrotondamento esplicita
Applica prima un metodo Math al decimal, quindi converti il risultato intero. Math.Floor si sposta verso meno infinito, quindi Math.Floor(-12.9m) è -13m; Math.Ceiling si sposta verso più infinito. Entrambi differiscono perciò da (int)-12.9m, che è -12.
Per arrotondare al più vicino con una regola deliberata per i punti medi, usa Math.Round(value, MidpointRounding.AwayFromZero). In questo modo 2.5m diventa 3m e -2.5m diventa -3m. Il metodo predefinito Math.Round(decimal) usa l’arrotondamento del punto medio verso il pari. Math.Truncate è un altro modo leggibile per ottenere un decimal intero verso zero prima di convertirlo in int.
Non eseguire il cast prima dell’arrotondamento: (int)value ha già eliminato la frazione, quindi una successiva chiamata a Math.Round non può ripristinare la scelta desiderata. Arrotonda prima, verifica il risultato e poi esegui il cast.
Gestire valori fuori dall’intervallo int
Un int è un intero con segno a 32 bit delimitato da int.MinValue e int.MaxValue; Int32 è il tipo corrispondente del framework. Un decimal può rappresentare valori oltre questi limiti. Una conversione da decimal a int genera già OverflowException quando il valore risultante è fuori dall’intervallo; non limita automaticamente il valore a uno degli estremi.
Valida il valore prima della conversione quando è possibile ricevere un input fuori intervallo oppure intercetta OverflowException al confine dell’applicazione. Una conversione checked può rendere esplicita l’intenzione e aiutare a verificare il contratto dell’intervallo, ma non è il meccanismo che rileva l’overflow per una conversione da decimal a int. Quando il contratto di destinazione lo consente, mantieni decimal o scegli un tipo intero più ampio invece di forzare silenziosamente il valore in int.
Scegliere la conversione adatta alla regola
| Risultato desiderato | Usa | Comportamento importante |
|---|---|---|
| Eliminare la frazione | (int)value |
Tronca verso zero. |
int più vicino |
Convert.ToInt32(value) |
I punti medi vengono arrotondati verso il pari. |
| Sempre più in basso o più in alto | Math.Floor o Math.Ceiling, poi il cast |
L’arrotondamento direzionale differisce dal troncamento per i valori negativi. |
| Comportamento personalizzato dei punti medi | Math.Round con MidpointRounding, poi il cast |
Dichiara esplicitamente la regola per risolvere i pareggi. |
Scegli il cast esplicito per il normale troncamento. Scegli Convert.ToInt32 o un metodo Math solo quando la relativa politica di arrotondamento è quella richiesta dall’applicazione e gestisci OverflowException al confine di int.