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 .

60
demandé sur Wouter Dorgelo 2012-05-25 16:15:19

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

88
répondu Jon 2012-05-25 12:44:49

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.

10
répondu neilgmacy 2012-05-25 12:20:05

vous pouvez arrondir votre double et lancer:

(int)Math.Round(myDouble);
7
répondu David 2012-05-25 12:20:04

ToInt32 rounds. Casting to int jette juste le composant non-entier.

2
répondu 2012-05-25 12:18:49

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
0
répondu Evdzhan Mustafa 2018-05-18 12:37:25