Forum Programmation.SQL SUM sur une colonne FLOAT (MySQL)

Posté par  .
Étiquettes : aucune
0
2
avr.
2011

Bonjour, je sais que ce sujet a été mainte fois abordé et je connais la solution au problème : le type DECIMAL.
Mais ici je voudrais comprendre un comportement bizarre de Mysql : le même calcul sur deux tables IDENTIQUES à part le nom me renvoie deux résultats différents !?

Je vous donne le contexte :
Une table

'ecriture' {INT date, INT metier, INT champ, FLOAT val}
sur laquelle je faisais des SUM(val) très simples selon différentes valeurs de date et champ.

Par exemple :

SELECT SUM(val) FROM ecriture
WHERE date='2011-01-28' AND metier='20001'.

Ayant constaté des erreurs dans les résultats, j'ai supposé que le type FLOAT en était responsable et ai voulu modifier la colonne pour la changer en DECIMAL.

Pour être sûr de ne rien perdre de mes données, j'ai d'abord exporté ma table en SQL avec PhpMyAdmin puis je l'ai appelée ecriture2 dans le fichier .sql et l'ai importée dans la base.

À ce stade, je n'ai fait AUCUNE modification de type, j'ai donc deux tables ecriture et ecriture2 IDENTIQUES en tous points (données, index, nom des colonnes, ...)

Et quelle fut ma surprise lorsqu'en essayant mes SUM sur la colonne val de ecriture2, j'obtint le bon résultat !
N'en croyant pas mes yeux je réessaye sur ecriture ... le résultat est faux.

Après une dizaine d'essais, je me rend à l'évidence. J'obtiens deux sommes différentes pour la même requete.
Je suis passé au type DECIMAL et mon problème de départ est résolu mais j'aimerais comprendre ...

  • # vérifications "élémentaires"

    Posté par  . Évalué à 4.

    Les virgules flottantes et erreurs numériques, c'est un vaste programme.
    Si tu as beaucoup de nombres très grands et très petits, ça peut rapidement devenir un bordel sans nom.

    Comme tu l'as trouvé tout seul, les SUM sur des types FLOAT, c'est une très mauvaise idée. En vérifiant vite fait, j'ai trouvé des références à ce "bug" (qui n'en est pas un) en 2003, 2006, et 2007. Je suis sûr qu'il y en a plus...

    Pour ce qui est de tes deux colonnes identiques qui ne donnent pas le même résultat, je ferais plusieurs choses (bêtes, mais bon...)
    1 - vérifier qu'elles sont aussi identiques que tu t'y attends
    2 - répéter les opération SUM pour vérifier que ton résultat est reproductible

    Comment s'y prend PHPMyAdmin pour exporter les flottants? (vraie question, j'ai jamais regardé)

  • # Corruption

    Posté par  . Évalué à 2.

    Si tu n'as pas l'erreur sur ta table fraiche, il est possible que la table d'origine soit corrompue. Regénère les index et reteste.

    • [^] # Re: Corruption

      Posté par  . Évalué à 0.

      J'y ai pensé (aux index) et ça n'a rien changé ... J'ai aussi vérifié une par une mes données et refait les calculs à la main ...

  • # IEEE754

    Posté par  (site web personnel) . Évalué à 3.

    En version courte, c'est que l'addition flottante n'est pas transitive ((a+b)+c != a+(b+c)). Le résultat exact de SUM() dépend donc de l'ordre des opérations.

    Pour la version longue, il faut lire "What Every Computer Scientist Should Know About Floating-Point Arithmetic"

    http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

    "La première sécurité est la liberté"

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.