web-dev-qa-db-fra.com

Conversion d'un double en un entier en C #

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.

81
Wouter Dorgelo

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).

128
Jon

vous pouvez arrondir votre double et faire votre premier tour:

(int)Math.Round(myDouble);
11
David

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.

11
neilgmacy

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
2
Evdzhan Mustafa

ToInt32 tours. Casting to int supprime simplement le composant non entier.

2
user146043