Bug calcul php

KountaK. Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
briiiiix Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'effectue avec php des calculs à partir de variables MySQL de type DECIMAL(6,2) et lorsque je tombe sur 0.05 + (-0.05) le résultat retourné par PHP est 1.3877787807814E-17 (en théorie ça devrait être 0 non ? ^^).

La version de PHP est 4.4.9

Dans PHPmyAdmin :
Version du serveur MySQL : 5.0.44-log
Version du client MySQL: 5.0.32

Merci
A voir également:

7 réponses

briiiiix Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   18
 
Tu dois convertir tes variables en type float, lis la documentation php et tu sauras comment convertir

-----------------------------------------
Les conversions autorisées sont :


(int), (integer) - type entier

(bool), (boolean) - booléen

(double), (float), (real) - type double

(string) - type chaîne de caractère

(array) - type tableau

(object) - type objet
1
KountaK. Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de ta réponse mais j'avais déjà regardé la doc à ce sujet.
Le problème persiste cependant.

Dois-je définir le type float dans mysql ou lors du calcul en php ? ou les 2 ?


J'ai déja essayé :

(float) 0.05 + (float) -0.05 mais le résultat reste le même.
(double) 0.05 + (double) -0.05 idem

Lorsque je le fais directement en php comme je viens de l'écrire ça donne bien zéro, mais quand je prend ces mêmes valeurs à partir de la bdd ça me donne un nombre qui tend vers zéro. (en prenant soin de définir les variables en php)

La colonne de la table en question était déjà de type float avant que je ne la convertisse en décimal, et le résultat était le même.
Le plus bizarre c'est que j'ai d'autres valeurs du même type dans cette table et ça donne bien zéro à chaque fois, c'est toujours les même lignes qui posent problèmes.

PS : lorsque je procède au calcul dans un ordre différent le résultat est bien zéro :s (ex : -0.05 + 0.05 = 0)
0
briiiiix Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   18
 
Est ce que tu as besoin que le résultat soit en float ou en int?
Si ton resultat doit etre en float tu pourras l'arrendir et comme ça tu auras 0
0
KountaK. Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Oui j'ai pensé a ce contournement de problème mais si je dois mettre du round() a chaque fois dans tous mes script ça va être la galère !

Est-ce que tout le monde fait comme ça ? ou est-ce un défaut de PHP ou MySQL ?

Comme je l'ai dis le plus bizarre c'est que sur les autres lignes de ma table qui ont exactement les mêmes valeurs et avec lesquelles je procède exactement au même calcul me retourne bien zéro, j'ai plus de 1000 lignes et il n'y a que ces 2 là qui me pose problème.

Dois-je toujours mettre du round() dans mes calcul pour éviter ce genre de bug ? (car pour moi ça reste un bug)

Cela fait des années que je touche à PHP+MySQL et c'est bien la 1ère fois que ça m'arrive.... :'(


En tout cas merci pour ton soutien ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
briiiiix Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   18
 
verifies dans mysql, si cette ligne contient un espace qui fausse tes calculs.
0
KountaK. Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai déjà vérifié ça aussi, j'ai modifié les 0.05 en 0.06 et les -0.05 en -0.06 pour que MySQL prenne en compte les modifications puis j'ai remis 0.05 et -0.05, le résultat reste le même.

Bien évidemment avec un round($resultat, 2) sur le résultat ça me retourne bien zéro mais faire du round() pour que 0.05 - 0.05 = 0 je trouve ça dommage que PHP ne comprenne pas ça.
0
briiiiix Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   18
 
Est ce possible de m'envoyer juste le fichier sql de la table par mail par exemple, je testerais nça chez moi.
Envoi moi stp un msg perso sur le forum je te renseignerais mon mail.
Bon travail
0