Conversion d'un double en int en C#
dans notre code nous avons un double que nous devons convertir en int.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
est-ce que quelqu'un peut m'expliquer pourquoi i1 != i2
?
Le résultat que j'obtiens est: i1 = 9
et i2 = 8
.
5 réponses
Parce que Convert.ToInt32
tours:
valeur de retour: arrondie à l'entier signé de 32 bits le plus proche. Si la valeur à mi-chemin entre deux nombres entiers, le même nombre est retourné; c'est, 4.5, est converti en 4 et 5.5 est converti à 6.
...tandis que la fonte tronque :
lorsque vous convertissez à partir d'une valeur Double ou d'une valeur flottante à un type intégral, le la valeur est tronquée.
mise à Jour: Voir Jeppe Stig Nielsen commentaire ci-dessous d'autres différences (qui toutefois ne pas entrer en jeu si score
est un nombre réel comme c'est le cas ici).
moulage ignorera tout après le point décimal, donc 8.6 devient 8.
Convert.ToInt32(8.6)
est le moyen sûr pour s'assurer que votre double est arrondi à l'entier le plus proche, dans ce cas 9.
vous pouvez arrondir votre double et lancer:
(int)Math.Round(myDouble);
dans l'exemple fourni, votre décimale est 8.6 . Si cela avait été 8.5 ou 9.5, l'affirmation i1 = i2 aurait pu être vraie. Enfait ça aurait été le cas pour 8.5, et false pour 9.5.
explication:
quelle que soit la partie décimale, la deuxième instruction, int i2 = (int)score
, supprimera la partie décimale et vous retournera simplement la partie entière. Très dangereux faire, comme la perte de données peut se produire.
Maintenant, pour la première déclaration, deux choses peuvent se produire. Si la partie décimale est 5, qui est, il est à mi-chemin à travers, une décision doit être prise. Ne nous tour vers le haut ou vers le bas? En C#, La classe Convert met en œuvre l'arrondi bancaire. Voir ce réponse pour explication plus approfondie. Tout simplement, si le nombre est pair, ronde en bas, si le nombre est impair, le round up.
E. G. Consider:
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