IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

conversion de double en int ne se fait pas correctement


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut conversion de double en int ne se fait pas correctement
    Bonjour
    Est ce que quelqu'un peut m'expliquer ca?
    conversion de double en int ne se fait pas correctement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
             double montantApayer = 80.74;
              int montantApayerEnCentime = 0;
              double i = (montantApayer * 100);
              MessageBox.Show("" + i); ===> affiche  8074
              MessageBox.Show("" + (int)i);===>affiche 8073

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Salut

    tu ne fais pas une conversion mais un cast...

    Si tu veux faire une vraie conversion, tu as la classe Convert qui est dédiée à ce genre d'actions. Utilises la et ne te pose pas "trop" de question
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    la classe Convert résoudre le probleme, mais vraiment je ne comprend pas pourquoi le casting ne marche pas?et il ne marche pas que pour 80.74

  4. #4
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    80,74 *100 === 8073.99999999999991

    d'où ton 8073.
    Je pourrais te dire pourquoi ca vaut cela mais ne le sachant pas, je ne te le dirai pas mais le debug a parlé
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    pourquoi avec le 80.74

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    single et double sont des nombres réels, donc parfois des quotients
    le nombre est stocké en mémoire sous forme de calcul
    pour des calculs juste il faut utiliser le type decimal (obligatoire pour des calculs financiers par exemple)
    le decimal est stockée comme un int, avec une information de où est la virgule

    si tu mets 1/3 dans un double, il vaut 1/3
    si tu mets 1/3 dans un decimal, il vaut 0.333333333333 avec un nombre de 3 limité à la taille du type decimal

    1/3 et 0.333333333 avec un nombre défini de 3 sont des nombres différents

    de la même manière, quand tu mets 0.8 dans un decimal, il vaut 0.8
    mais quand tu mets 0.8 dans un double, il cherche un moyen de l'écrire sous forme d'équation, car il n'a pas d'information de virgule, ce n'est pas un string ; donc il va stocker 4/5
    dans le cas de 80.74, il cherche un quotient qui s'en rapproche le plus, et qui ne vaut donc pas 80.74
    quand tu multiplies des double entre eux, pas de soucis, l'approximation allant assez loin, ca tombe en général juste (bienque en restant sur des doubles avec une facture ou un bulletin de paye, à la fin on a souvent un ou deux centimes de différences)

    dans les bases de données il y a souvent les types money et smallmoney, qui sont des dérivés de décimal (ou numeric)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    merci pour la réponse

  8. #8
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    j'ai fait des recherches et c'est sous forme équation mais simplement sous une puissance de 2. ce qui revient au même, il n'existe pas de puissance de 2 qui donne 80,74 d'où son 80,7399999991.

    dans le même genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double i = 1/3; ==> donne 0
    decimal i = 1/3; ==> donne 0
    double i = 1.0/3 ==> donne 0,333333331

    faut faire super attention avec les nombres
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  9. #9
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    juste pour info, il s'agit d'une norme IEEE qui définit la façon de stocker les nombres.. avec la mantisse et un chiffre

    Et effectivement, si tu fais l'opération suivante:


    (1/3) * 3 , tu n'auras pas 1... C'est quelque chose qui s'apprend et dont il faut tenir compte par exemple dans les domaines de l'aéronautique...

    C'est pourquoi, en théorie, il faudrait comparer des doubles avec d'autres valeurs + un epsilon... bref, c'est un peu des mathématiques
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WM18] Addition qui ne se fait pas correctement.
    Par vinoc dans le forum Windev Mobile
    Réponses: 1
    Dernier message: 06/03/2015, 19h23
  2. conversion double en int
    Par medchafik dans le forum C++
    Réponses: 5
    Dernier message: 11/03/2012, 22h24
  3. [XL-2007] le tri ne se fait pas correctement en VBA
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/04/2009, 10h59
  4. Réponses: 2
    Dernier message: 23/02/2009, 11h04
  5. Int 21H AX=716Ch ne fait pas mon affaire !!
    Par TheBigMac dans le forum Assembleur
    Réponses: 4
    Dernier message: 10/09/2004, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo