Comment faire pour convertir un nombre décimal en un int en C#?
Comment faire pour convertir un nombre décimal en un int?
- Il serait utile de savoir si vous voulais arrondir au plus proche int ou déposez simplement les chiffres après la virgule (c'est à dire: toujours arrondi à l'inférieur)
- honnêtement, je ne vois pas l'intérêt dans downvoting de vraies questions. oui, la réponse a pu être trouvé sur google, MAIS ne serait-il pas simplement d'améliorer la qualité du site si les gens ont arrêté de fermeture de chaque seconde question? c'est pas comme si cette question est un spam ou quoi que ce soit, et je suis sûr que ce serait utile pour de nombreux nouveaux arrivants, pour c#
Vous devez vous connecter pour publier un commentaire.
Utilisation
Convert.ToInt32
demscorlib
comme dansVoir MSDN. Vous pouvez également utiliser
Decimal.ToInt32
. Encore une fois, voir MSDN. Enfin, vous pouvez le faire directement en fonte comme dansqui utilise explicitement l'opérateur de cast. Voir MSDN.
null
vs0
vs""
). Je vous recommande de ne jamais utiliser Convertir, sauf si vous avez absolument besoin de sa flexibilité (c'est à dire dans typées dynamiquement des scénarios)OverflowException
. Je crois que @fournit une meilleure réponse ici stackoverflow.com/a/501165/39532Convert.ToInt32
etDecimal.ToInt32
se comportent différemment. À partir de MSDN:Decimal.ToInt32
- La valeur de retour est la partie intégrante de la valeur décimale; chiffres fractionnaires sont tronquée.Convert.ToInt32
- Valeur de retour arrondi au plus proche entier signé 32 bits. Si la valeur est à mi-chemin entre deux nombres entiers, le même nombre est retourné, qui est, à 4.5 est converti à 4 et 5.5 est converti à 6.Vous ne pouvez pas.
Bien entendu que vous pourrait, cependant un int (Système d'.Int32) n'est pas assez grande pour contenir tous les possibles valeur décimale.
Cela signifie que si vous lancez une décimale de plus de int.MaxValue vous fera déborder, et si la décimale est inférieure à int.MinValue, il underflow.
Ce qui se passe quand vous sous/débordement? De deux choses l'une. Si votre construction est désactivée (c'est à dire, le CLR ne se soucie pas si vous n'), votre demande va continuer après la valeur au-dessus de/underflows, mais la valeur de l'int ne sera pas ce que vous attendiez. Cela peut conduire à des bugs et peut être difficile à corriger. Vous finirez votre application dans un état inconnu qui peut entraîner votre demande de corrompre ce qu'données importantes de son travail. Pas bonne.
Si votre montage est cochée (propriétés->build->avancé>vérifier pour dépassement de capacité arithmétique/dépassement de capacité ou de l' /cochée l'option de compilateur), votre code génère une exception lorsqu'un débordement se produit. C'est sans doute mieux que pas; toutefois, la valeur par défaut pour les assemblées n'est pas de vérifier plus de/underflow.
La vraie question est "qu'essayez-vous de faire?" Sans le savoir à vos besoins, personne ne peut vous dire ce que vous devrait faire dans ce cas, autre que l'évidence: NE PAS le FAIRE.
Si vous n'avez PAS de soins, les réponses données ici sont valables. Cependant, vous devez communiquer votre compréhension que les débordements peuvent se produire et qu'il n'a pas d'importance en l'enveloppant votre fonte de code dans un décoché bloc
Cette façon, les gens qui viendront après vous comprenez que vous n'avez pas de soins, et si à l'avenir quelqu'un change votre construit pour /cochée, votre code ne sera pas briser de façon inattendue.
Si tout ce que vous voulez faire est de déposer de la partie fractionnaire du nombre, de quitter la partie, vous pouvez utiliser les Mathématiques.Tronquer.
vous donnera le nombre arrondi à l'inférieur.
Si vous voulez arrondir au nombre pair le plus proche (c'est à dire >.5 sera arrondir), vous pouvez utiliser
En général, vous pouvez convertir entre tous les types numériques en C#. Si aucune information ne sera perdue lors de la fonte, vous pouvez le faire implicitement:
mais vous pouvez toujours le faire de façon explicite si vous le souhaitez:
Toutefois, si vous allez perdre de l'information par le biais de la distribution, vous devez le faire de façon explicite (pour montrer que vous êtes conscient que vous risquez de perdre de l'information):
Ici, vous sont en train de perdre la ".5". Cela peut être très bien, mais vous devez être explicites à ce sujet et de faire un cast explicite pour montrer que vous savez que vous risquez de perdre de l'information.
ToEven
devrait prévenir la statistique de la dérive. Si vous cependant fonctionner avec des articles gratuits ou de l'argent,AwayFromZero
semble être le bon choix.Cela devrait fonctionner très bien.
Ici est une application très utile de convertir le type de données de la page web pour ceux des autres.
http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
System.Decimal
met en œuvre laIConvertable
interface, ce qui a unToInt32()
membre.Fait appel
System.Decimal.ToInt32()
travail pour vous?Une astuce rapide pour l'arrondi est à ajouter .5 avant de lancer votre décimale d'un entier (int).
Laisse encore
i=10
, maisAutour de sorte que
i=11
.Je préfère utiliser Les mathématiques.Ronde, Les mathématiques.Étage, Les mathématiques.Plafond ou Les mathématiques.Tronquer à définir explicitement le mode d'arrondi selon le cas.
Remarque qu'ils sont tous de retour Décimal ainsi - depuis Décimal a une plus grande plage de valeurs qu'une Int32, de sorte que vous aurez toujours besoin de cast (et vérifier pour le débordement/underflow).
décimal
d = 5.5
;ref: texte du lien
Arrondir un nombre décimal à l'entier le plus proche
quand
a = 49.9
, puisb = 50
quand
a = 49.5
, puisb = 50
quand
a = 49.4
, puisb = 49
etc.Je trouve que le casting opérateur ne fonctionne pas si vous avez une boîte décimal (c'est à dire une valeur décimale à l'intérieur d'un type d'objet). Convertir des.ToInt32(décimal comme objet) fonctionne très bien dans ce cas.
Cette situation provient en place lors de la récupération de l'IDENTITÉ/numérotation automatique des valeurs de la base de données:
Voir 4.3.2 Unboxing conversions
SELECT SCOPE_IDENTITY()
retournenumeric(38, 0)
qui se traduit pardecimal
par .NET.foo.ExecuteScalar()
renvoie unedecimal
boîte commeobject
qui ne peut pas être utilisé directement vers unint
.(int)(decimal)foo.ExecuteScalar()
ouConvert.ToInt32(foo.ExecuteScalar())
serait de travailler.