Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 21/03/2013, à 11:25

titienne

Re : c++ double(7.6) + double(-7.6) = double(1.77636e-15) !?

Bonjour à tous,
Je suis débutant en c++ et Qt et je suis sur un petit projet pour géré les rappel d'impayé de cantine d'une école.
le me retrouve donc à récupérer un csv de tout les passage de cantine de tous les élèves et du personnels.

À un moment je doit faire des boucle pour calculer le solde des élèves et à chaque fois que le calcul passe par "0" mon et bien en faite il est égale a "1.77636e-15"

(m_listeBrut est un QMiltiMap)

        foreach (int user, listUser)                                      //récupère user de la liste user
        {
            listSolde = m_listeBrut.values(user);                         //récupère liste de solde de l'user
            soldeUser = 0;

            foreach (double solde, listSolde)                             //récupère solde de la liste de solde de l'user
            {
                if (user == 1277)
                    qDebug() << soldeUser + solde << " = " << soldeUser << " + "<< solde;

                soldeUser += solde;
            }

résulta pour l'user 1277 :

0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
22.8  =  0  +  22.8 
22.8  =  22.8  +  0 
15.2  =  22.8  +  -7.6 
15.2  =  15.2  +  0 
15.2  =  15.2  +  0 
15.2  =  15.2  +  0 
15.2  =  15.2  +  0 
7.6  =  15.2  +  -7.6 
7.6  =  7.6  +  0 
1.77636e-15  =  7.6  +  -7.6 
1.77636e-15  =  1.77636e-15  +  0 
1.77636e-15  =  1.77636e-15  +  0 

si quelqu'un peux m'éclairer se serai sympa.
Merci

Hors ligne

#2 Le 21/03/2013, à 11:38

pingouinux

Re : c++ double(7.6) + double(-7.6) = double(1.77636e-15) !?

Bonjour,
C'est un problème d'arrondi, les valeurs stockées en mémoire  n'étant pas rigoureusement exactes. On peut afficher le résultat ainsi :

round(val*100+0.5)/100

Hors ligne

#3 Le 21/03/2013, à 11:50

claudius01

Re : c++ double(7.6) + double(-7.6) = double(1.77636e-15) !?

Bonjour,

Effectivement, et je me permets d'ajouter :

La solution est en général d'utiliser un nombre epsilon propre à l'application (par exemple 1.0e-3) et auquel sera comparé le résultat pour dire que ce dernier est égal à zéro ou employé lors d'un test d'égalité entre 2 nombres flottants.

Une autre solution et dans la mesure du possible est de travailler avec des nombres entiers (long long) codant les centièmes ou millièmes d'Euros pour minimiser les erreurs d'arrondis.


Cordialement, A+
--
Claudius

Hors ligne

#4 Le 21/03/2013, à 12:27

Braun

Re : c++ double(7.6) + double(-7.6) = double(1.77636e-15) !?

Bonjour,
Ce problème est classique dans tous les logiciels qui calculent bêtement en "floating point".
Le seul calcul honnête étant celui effectué en "integer", je crois que j'opterais pour un calcul en centimes d'euros comme le font beaucoup d'administrations.
Mais bien sûr rien n'est parfait.

Hors ligne

#5 Le 21/03/2013, à 15:06

titienne

Re : c++ double(7.6) + double(-7.6) = double(1.77636e-15) !?

merci à vous sa fonctionne maintenant en ajoutant round()
en plus vous m'avais expliquez pourquoi il faisait ça ! j'aurai apris quelque chose aujourd'hui.

        foreach (int user, listUser)                                      //recupere user de la liste user
        {
            listSolde = m_listeBrut.values(user);                         //recupere liste de solde de user
            soldeUser = 0;

            foreach (double solde, listSolde)                             //recupere solde de la liste de solde
            {
                if (user == 1277)
                    qDebug() << round(soldeUser*100) / 100 + round(solde * 100) / 100 << " = " << soldeUser << " + "<< solde;
                soldeUser = round(soldeUser*100) / 100 + round(solde * 100) / 100;
            }

résulta :

0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
0  =  0  +  0 
22.8  =  0  +  22.8 
22.8  =  22.8  +  0 
15.2  =  22.8  +  -7.6 
15.2  =  15.2  +  0 
15.2  =  15.2  +  0 
15.2  =  15.2  +  0 
15.2  =  15.2  +  0 
7.6  =  15.2  +  -7.6 
7.6  =  7.6  +  0 
0  =  7.6  +  -7.6 
0  =  0  +  0 
0  =  0  +  0

merci !

Hors ligne

Haut de page ↑