248 votes

Comment convertir un décimal en un int en C# ?

Comment convertir une décimale en int ?

13 votes

Il serait utile de savoir si vous souhaitez arrondir à l'unité la plus proche ou simplement laisser tomber les chiffres après la décimale (c'est-à-dire toujours arrondir au chiffre inférieur).

296voto

Jason Points 125291

Utilisez Convert.ToInt32 de mscorlib dans le cas de

decimal value = 3.14m;
int n = Convert.ToInt32(value);

Voir MSDN . Vous pouvez également utiliser Decimal.ToInt32 . Encore une fois, voir MSDN . Enfin, vous pouvez faire un casting direct comme dans

decimal value = 3.14m;
int n = (int) value;

qui utilise l'opérateur cast explicite. Voir MSDN .

10 votes

Attention : Convert a un comportement surprenant pour certaines conversions ( null vs. 0 vs. "" ). Je recommande de ne jamais utiliser Convert à moins que vous n'ayez absolument besoin de sa flexibilité (c'est-à-dire dans des scénarios typés dynamiquement).

1 votes

-1, car cela ne fonctionnera pas pour des valeurs telles que decimal.MaxValue et decimal.MinValue et entraînera l'apparition d'un OverflowException . Je crois que @Will fournit une meilleure réponse ici. stackoverflow.com/a/501165/39532

10 votes

Faites attention, car Convert.ToInt32 y Decimal.ToInt32 se comportent différemment. De MSDN : Decimal.ToInt32 - La valeur de retour est la partie entière de la valeur décimale ; les chiffres fractionnaires sont tronqué . Convert.ToInt32 - Valeur de retour arrondi au nombre entier signé de 32 bits le plus proche. Si la valeur est à mi-chemin entre deux nombres entiers, le nombre pair est renvoyé ; c'est-à-dire que 4,5 est converti en 4, et 5,5 en 6.

68voto

Will Points 76760

Tu ne peux pas.

Bien sûr, vous pourrait Cependant, un int (System.Int32) n'est pas assez grand pour contenir toutes les valeurs décimales possibles.

Cela signifie que si vous intégrez une décimale supérieure à int.MaxValue, vous déborderez, et si la décimale est inférieure à int.MinValue, elle débordera.

Que se passe-t-il en cas de sous-débit ou de débordement ? Il y a deux possibilités. Si votre compilation n'est pas vérifiée (c'est-à-dire que le CLR ne se soucie pas de ce que vous faites), votre application continuera après le débordement/sous-débordement de la valeur, mais la valeur de l'int ne sera pas celle que vous attendiez. Cela peut conduire à des bogues intermittents et peut être difficile à corriger. Votre application se retrouvera dans un état inconnu, ce qui peut entraîner la corruption des données importantes sur lesquelles elle travaille. Ce n'est pas bon.

Si votre assemblage est vérifié (properties->build->advanced->check for arithmetic overflow/underflow ou l'option de compilation /checked), votre code lèvera une exception lorsqu'un under/overflow se produira. C'est probablement mieux que rien ; cependant, la valeur par défaut des assemblages n'est pas de vérifier le dépassement de capacité.

La vraie question est "qu'essayez-vous de faire ?". Sans connaître vos besoins, personne ne peut vous dire ce que vous devez faire. devrait dans ce cas, autre que l'évident : ne le faites pas.

Si vous vous en fichez, les réponses données ici sont valables. Cependant, vous devriez communiquer que vous comprenez qu'un dépassement de capacité peut se produire et que cela n'a pas d'importance en enveloppant votre code coulé dans une balise non vérifié bloc

unchecked
{
  // do your conversions that may underflow/overflow here
}

De cette façon, les personnes qui viennent derrière vous comprennent que vous ne vous en souciez pas, et si, à l'avenir, quelqu'un modifie vos builds en /checked, votre code ne sera pas cassé de manière inattendue.

Si Si vous souhaitez simplement supprimer la partie fractionnaire du nombre, en laissant la partie intégrale, vous pouvez utiliser Math.Truncate.

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));

3 votes

Bien que je soupçonne qu'il s'agisse de la même chose si l'entrée est un décimal, je me sens plus à l'aise en utilisant Decimal.Truncate que Math.Truncate, puisque ce dernier accepte également les doubles et peut donc être compris comme capable de tronquer les nombres pairs qui ne sont pas en base 10, contrairement à Decimal.Truncate, qui est une véritable troncature d'un nombre en base 10.

7 votes

Les contextes non vérifiés ne s'appliquent pas aux décimales ; les opérations sur les décimales déclencheront des OverflowExceptions de toute façon.

48voto

ICR Points 6960
int i = (int)d;

vous donnera le nombre arrondi à la baisse.

Si vous voulez arrondir au nombre pair le plus proche (c'est-à-dire que >.5 sera arrondi vers le haut), vous pouvez utiliser

int i = (int)Math.Round(d, MidpointRounding.ToEven);

En général, vous pouvez effectuer des castings entre tous les types numériques en C#. Si aucune information n'est perdue pendant le cast, vous pouvez le faire implicitement :

int i = 10;
decimal d = i;

mais vous pouvez toujours le faire explicitement si vous le souhaitez :

int i = 10;
decimal d = (decimal)i;

Toutefois, si vous perdez des informations par le biais du casting, vous devez le faire explicitement (pour montrer que vous êtes conscient que vous pouvez perdre des informations) :

decimal d = 10.5M;
int i = (int)d;

Ici, vous perdez le ".5". Cela peut être correct, mais vous devez être explicite à ce sujet et faire un moulage explicite pour montrer que vous savez que vous pouvez perdre l'information.

1 votes

Vous voulez en fait MidpointRounding.AwayFromZero si vous voulez que > *.5 soit toujours arrondi vers le haut, d'après mon expérience en essayant le code ci-dessus en regardant l'exemple de sortie ici : msdn.microsoft.com/fr/us/library/

0 votes

@ElijahLofgren Ça dépend : Si tu fais des statistiques, ToEven devrait empêcher la dérive des statistiques. Si toutefois vous opérez avec des articles facturables ou de l'argent, AwayFromZero semble être le bon choix.

25voto

luiscubal Points 8870
decimal d = 2;
int i = (int) d;

Cela devrait fonctionner parfaitement.

1 votes

Attention, avec une conversion explicite, des informations pourraient être perdues.

21 votes

Lors de la conversion de décimal en int, des informations seront presque toujours perdues, mais je crois que c'est un peu le but.

18voto

James Points 3
decimal vIn = 0.0M;
entint vOut = Convert.ToInt32(vIn);r code here

Voici une page web très pratique pour convertir le type de données pour ceux d'autres. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X