web-dev-qa-db-fra.com

Comment convertir une décimale en int en C #?

Comment convertir une décimale en int?

209
Neil P

Utilisez Convert.ToInt32 à partir de mscorlib comme dans

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 de diffusion explicite. Voir MSDN .

255
jason

Tu ne peux pas.

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

Cela signifie que si vous utilisez une décimale supérieure à int.MaxValue, vous allez déborder, et si la décimale est inférieure à int.MinValue, elle déborde.

Que se passe-t-il lorsque vous sous/débordez? Une des deux choses. Si votre construction n’est pas cochée (c’est-à-dire que le CLR ne vous intéresse pas du tout), votre application continuera après la valeur over/underflow, mais la valeur dans le int ne sera pas celle que vous attendiez. Cela peut entraîner des bugs intermittents et peut être difficile à corriger. Vous finirez votre application dans un état inconnu, ce qui peut la corrompre, quelles que soient les données importantes sur lesquelles il travaille. Pas bon.

Si votre assemblage est coché (propriétés-> build-> avancé-> vérifier les débordements/débordements arithmétiques ou l'option du compilateur/vérifié), votre code lève une exception lorsqu'un débordement/débordement se produit. C'est probablement mieux que pas; Cependant, la valeur par défaut pour les assemblages est de ne pas vérifier les débordements.

La vraie question est "qu'essayez-vous de faire?" Sans connaître vos besoins, personne ne peut vous dire ce que vous devriez faire dans ce cas, si ce n’est une évidence: NE LE FAITES PAS.

Si vous vous en fichez, les réponses sont valables. Cependant, vous devriez communiquer votre compréhension du risque de débordement et que le problème est peu important en encapsulant votre code de distribution dans un bloc non contrôlé

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

De cette façon, les personnes qui se trouvent derrière vous comprennent que vous ne vous en souciez pas, et si, à l'avenir, quelqu'un modifie/vérifie vos versions, votre code ne sera pas interrompu de manière inattendue.

Si tout ce que vous voulez faire est de supprimer la fraction 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));
68
Will
int i = (int)d;

vous donnera le nombre arrondi.

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

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

En général, vous pouvez utiliser tous les types numériques en C #. Si aucune information ne sera perdue lors de la diffusion, vous pouvez le faire implicitement:

int i = 10;
decimal d = i;

bien que vous puissiez 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 savez que vous perdez peut-être des informations):

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

Ici, vous perdez le ".5". Cela peut aller, mais vous devez être explicite à ce sujet et faire un casting explicite pour montrer que vous savez que vous perdez peut-être ces informations.

43
ICR
decimal d = 2;
int i = (int) d;

Cela devrait bien fonctionner.

21
luiscubal
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);

Voici une page Web très pratique pour les types de données de conversion pour ceux des autres. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html

11
Darren

System.Decimal implémente l'interface IConvertable, qui a un membre ToInt32().

Appeler System.Decimal.ToInt32() fonctionne pour vous?

8
Andy

Pour arrondir rapidement, il est judicieux d’ajouter 0,5 avant de convertir votre nombre décimal en int.

decimal d = 10.1m;
d += .5m;
int i = (int)d;

Laisse toujours i=10, mais

decimal d = 10.5m;
d += .5m;
int i = (int)d;

Arrondirait pour que i=11.

7
DeadlyBrad42

décimal d = 5.5;

int i = decimal.ToInt32(d);// you will get i = 5

ref: texte du lien

6
__w

Je préfère utiliser Math.Round , Math.Floor , Math.Ceiling ou Math.Truncate pour définir explicitement le mode d'arrondi selon le cas.

Notez qu'ils renvoient tous aussi bien Decimal - Decimal ayant une plage de valeurs plus étendue qu'un Int32, vous aurez donc toujours besoin de transtyper (et de vérifier le débordement/le débordement).

 checked {
   int i = (int)Math.Floor(d);
 }
6
Mark Brackett

Arrondir une décimale à l'entier le plus proche

decimal a ;
int b = (int)(a + 0.5m);

quand a = 49.9, puis b = 50

quand a = 49.5, puis b = 50

quand a = 49.4, puis b = 49 etc.

5
sleepwalkerfx

Je trouve que l'opérateur de casting ne fonctionne pas si vous avez une décimale encadrée (c'est-à-dire une valeur décimale à l'intérieur d'un type d'objet). Convert.ToInt32 (décimal en tant qu'objet) fonctionne bien dans ce cas.

Cette situation se produit lors de l'extraction des valeurs IDENTITY/AUTONUMBER de la base de données:

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar());  // works
int ID = (int)foo.ExecuteScalar();              // throws InvalidCastException

Voir 4.3.2 Conversions Unboxing

0
Timbo