Dans notre code, nous avons un double qu'il faut convertir en int.
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 obtenu est que: i1 = 9
et i2 = 8
.
Parce que Convert.ToInt32
tours:
Valeur de retour: arrondi à l'entier signé 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 que 5,5 est converti en 6.
... pendant que le casting tronque :
Lorsque vous convertissez une valeur double ou float en un type intégral, la valeur est tronquée.
Mise à jour: Voir le commentaire de Jeppe Stig Nielsen ci-dessous pour connaître les différences supplémentaires (qui n'entrent toutefois pas en jeu si score
est un nombre réel tel qu'il est le cas ici).
vous pouvez arrondir votre double et faire votre premier tour:
(int)Math.Round(myDouble);
La diffusion ignorera tout ce qui suit le point décimal, de sorte que 8.6 devient 8.
Convert.ToInt32(8.6)
est le moyen sûr de vous assurer que votre double est arrondi au nombre entier le plus proche, dans ce cas 9.
Dans l'exemple fourni, votre nombre décimal est 8.6 . Si cela avait été 8.5 ou 9.5, la déclaration i1 == i2 aurait pu être vraie. Enfait, 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 très dangereuse à faire, car des pertes de données pourraient 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. Est-ce que nous arrondissons de haut en bas? En C #, la classe Convert implémente l'arrondi de banker. Voir this answer pour une explication plus détaillée. Autrement dit, si le nombre est pair, arrondissez-le vers le bas, si le nombre est impair, arrondissez-le vers le haut.
Par exemple. Considérer:
double score = 8.5;
int i1 = Convert.ToInt32(score); // 8
int i2 = (int)score; // 8
score += 1;
i1 = Convert.ToInt32(score); // 10
i2 = (int)score; // 9
ToInt32 tours. Casting to int supprime simplement le composant non entier.