Contenu | Rechercher | Menus

Annonce

Ubuntu-fr.org recrute toujours de nouveaux modérateurs, avec de l'expérience.

Ubuntu 16.04 LTS
Réservez vos DVD et clé USB Ubuntu-fr (premières livraisons mi-mai)

Si vous avez des soucis pour rester connecté, déconnectez vous et reconnectez vous depuis ce lien en cochant le case
Me connecter automatiquement lors de mes prochaines visites.

M.A.J. en cours du forum possibilité de bug, nous faisons le maximum pour les résoudre au plus vite

#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