Dans notre code, nous avons un double que nous devons convertir en un entier.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Quelqu'un peut-il m'expliquer pourquoi i1 != i2
?
Le résultat que j'obtiens est que: i1 = 9
et i2 = 8
.
Math.Truncate(score)
est une intention plus explicitement exprimée que(int)score
Réponses:
Parce que les
Convert.ToInt32
tours:... pendant que le casting tronque :
Mise à jour: Voir le commentaire de Jeppe Stig Nielsen ci-dessous pour des différences supplémentaires (qui cependant n'entrent pas en jeu s'il
score
s'agit d'un nombre réel comme c'est le cas ici).la source
score
c'était8.5
au lieu de8.6
. J'ai mis à jour la réponse pour inclure les citations. Merci pour la contribution.score
estNaN
ou un infini ou fini mais en dehors de la plage deInt32
, alorsConvert.ToInt32
lèvera une exception. Cast retournera unint
, mais vous ne saurez pas lequel (dans mon implémentation c'estInt32.MinValue
) parce que vous êtes dans leunchecked
contexte. (Si vous êtes dans lechecked
contexte, le casting lancera également une exception dans ces cas.)Double
nombre type10000000000.6
(dix milliards virgule six) est un nombre «réel». Utiliser un castingint
sur qui donnera un résultat étrange (sauf si vous êtes dans lechecked
contexte, mais vous ne l'êtes probablement pas).La diffusion ignorera tout ce qui se trouve après la virgule décimale, donc 8.6 devient 8.
Convert.ToInt32(8.6)
est le moyen sûr de s'assurer que votre double est arrondi à l'entier le plus proche, dans ce cas 9.la source
vous pouvez arrondir votre double et lancer ist:
la source
i1 == i2
. La question était de savoir pourquoi ils ne sont pas égaux. Voté contre.Dans l'exemple fourni, votre décimal est 8,6 . S'il avait été 8,5 ou 9,5, l'affirmation i1 == i2 aurait pu être vraie. En fait, cela aurait été vrai pour 8,5 et faux pour 9,5.
Explication:
Indépendamment de la partie décimale, la deuxième instruction
int i2 = (int)score
supprimera la partie décimale et vous renverra simplement la partie entière. Chose assez dangereuse à faire, car une perte de données pourrait survenir.Maintenant, pour la première déclaration, deux choses peuvent arriver. Si la partie décimale est 5, c'est-à-dire qu'elle est à mi-chemin, une décision doit être prise. Arrondissons-nous vers le haut ou vers le bas? En C #, la classe Convert implémente l'arrondi du banquier. Voir cette réponse pour une explication plus approfondie. En termes simples, si le nombre est pair, arrondissez vers le bas, si le nombre est impair, arrondissez vers le haut.
Par exemple, considérez:
la source
ToInt32 tours. La conversion en int jette simplement le composant non entier.
la source