HOWTO · Csharp
Convertir decimal en int en C#
Choisissez la troncature, l’arrondi à l’entier le plus proche ou un arrondi dirigé pour convertir decimal en int en C#, et gérez les valeurs hors de la plage Int32.
Sur cette page
Utilisez (int)value lorsque vous voulez supprimer la partie fractionnaire. Utilisez Convert.ToInt32(value) pour arrondir à l’entier le plus proche, et une méthode Math lorsque votre règle impose un arrondi dirigé ou une politique précise pour les valeurs médianes. L’exemple compact suivant compare ces choix avec des valeurs positives.
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 politique de conversion est une règle métier, et non un détail de formatage. Si la partie fractionnaire reste significative, par exemple pour de l’argent ou des mesures, conservez la valeur en decimal. Toute conversion finale vers int doit également tenir compte des valeurs qui ne peuvent pas être représentées par Int32.
Tronquer un decimal vers zéro
Un cast explicite, (int)value, est le choix le plus clair pour tronquer. Un littéral decimal doit comporter le suffixe m ; sans lui, un littéral tel que 12.9 est un double. La conversion d’un decimal vers un type entier s’effectue vers zéro : (int)12.9m vaut 12, tandis que (int)-12.9m vaut -12. Il ne s’agit donc ni d’un arrondi vers le bas ni d’un arrondi vers le haut. La référence des conversions numériques C# documente le comportement vers zéro et l’échec lorsque la valeur sort de la plage.
Arrondir à l’entier le plus proche
Convert.ToInt32(decimal) arrondit à l’entier signé de 32 bits le plus proche au lieu de tronquer. Lorsque la partie fractionnaire est exactement .5, il applique l’arrondi des milieux vers le pair : Convert.ToInt32(12.5m) vaut 12, tandis que Convert.ToInt32(13.5m) vaut 14. Cette méthode convient aux mesures qui doivent atteindre l’unité entière la plus proche, mais pas lorsque chaque valeur médiane doit s’éloigner de zéro.
La documentation de la surcharge decimal de Convert.ToInt32 indique qu’une valeur située hors de la plage de int provoque OverflowException. La méthode ne rend pas sûr un decimal trop grand.
Choisir une règle d’arrondi explicite
Appliquez d’abord une méthode Math au decimal, puis convertissez le résultat entier. Math.Floor se déplace vers moins l’infini, de sorte que Math.Floor(-12.9m) vaut -13m ; Math.Ceiling se déplace vers plus l’infini. Les deux méthodes diffèrent donc de (int)-12.9m, qui vaut -12.
Pour un arrondi à l’entier le plus proche avec une règle de départage explicite, utilisez Math.Round(value, MidpointRounding.AwayFromZero). Cette méthode transforme 2.5m en 3m et -2.5m en -3m. Par défaut, Math.Round(decimal) applique l’arrondi des milieux vers le pair. Math.Truncate offre une autre façon lisible d’obtenir un decimal entier orienté vers zéro avant de le convertir en int.
Ne castez pas avant l’arrondi : (int)value a déjà supprimé la fraction, et un appel ultérieur à Math.Round ne peut pas restaurer le choix souhaité. Arrondissez d’abord, vérifiez le résultat, puis castez.
Gérer les valeurs hors de la plage int
Un int est un entier signé de 32 bits compris entre int.MinValue et int.MaxValue ; Int32 est le type correspondant dans le framework. Un decimal peut représenter des valeurs dépassant ces limites. Une conversion de decimal vers int lève déjà OverflowException lorsque la valeur obtenue est hors de cette plage ; elle ne la ramène pas automatiquement à l’une des bornes.
Validez la valeur avant la conversion lorsqu’une entrée hors plage est possible, ou interceptez OverflowException à la frontière de l’application. Une conversion checked peut expliciter l’intention et aider à tester le contrat de plage, mais ce n’est pas le mécanisme qui détecte le dépassement lors d’une conversion de decimal vers int. Lorsque le contrat qui reçoit la valeur l’autorise, conservez decimal ou choisissez un type entier plus large au lieu de forcer silencieusement la valeur dans un int.
Choisir la conversion adaptée à la règle
| Résultat recherché | À utiliser | Comportement important |
|---|---|---|
| Supprimer la fraction | (int)value |
Tronque vers zéro. |
int le plus proche |
Convert.ToInt32(value) |
Les valeurs médianes sont arrondies vers le pair. |
| Toujours plus bas ou toujours plus haut | Math.Floor ou Math.Ceiling, puis un cast |
L’arrondi dirigé diffère de la troncature pour les valeurs négatives. |
| Comportement personnalisé aux milieux | Math.Round avec MidpointRounding, puis un cast |
Indiquez explicitement la règle de départage. |
Choisissez le cast explicite pour une troncature ordinaire. Choisissez Convert.ToInt32 ou une méthode Math uniquement lorsque sa politique d’arrondi correspond à celle requise par votre application, et gérez OverflowException à la limite de int.