#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