8791 sujets

Développement web côté serveur, CMS

Bonjour,

j'ai easyphp 5.3.2 et phpmyadmin 3.2.5
J'ai fait une base de donnée avec table dans laquelle j'ai un champ qui est de type float(10,2).
Et j'ai des comportements qui me paraissent bizarres.
Si j'édite ma base dans phpmyadmin et que je mets par exemple :
487481.54 ça me met 487481.53
1518948.15 ça me met 1518948.13
12540000.25 ça me met 12540000.00


Pourquoi ?
Je penses que je vais passer en decimal(10,2) qui semble bien fonctionner lui....
Mais je ne comprends toujours pas le comportement avec float Smiley eek
Salut,
dzaohfz a écrit :
Personne pour me conseiller et m'éclairer ? Smiley smile

Dans le manuel de MySQL, voici ce que je peux lire :
Le manuel de MySQL a écrit :
Utiliser des FLOAT peut vous donner des résultats inattendus, car les calculs sont fait en précision double.

Et il m'invite à lire cette page de résolution des problèmes des lignes non retournées, où je lis, entre autres :
Le manuel de MySQL a écrit :
Si vous comparez des colonnes FLOAT ou DOUBLE avec des nombres à virgule, vous ne pouvez pas utiliser '='. C'est un problème commun à la plupart des langages de programmation car les valeurs à virgules flottantes ne sont pas des valeurs exactes. Dans le plupart des cas, changer la colonnes FLOAT en DOUBLE corrigera cela.

Et il m'invite à lire cette page sur les problèmes de comparaisons avec nombres à virgule flottante, qui comporte des informations susceptibles de t'éclairer.

Moralité : RTFM (fût-il un peu mal fichu, je l'accorde). Smiley cligne
AH oui tu m'étonne qu'il est mal fichu... tout comme le MySQL quand on lit ce qu'ils osent écrire dans leur manuel... ils font des types qui "peuvent donner des résultats inattendus"... c'est pas trop ce qu'on attend d'un logiciel pro....
dzaohfz : "Ils" n'ont rien inventé concernant les flottants en informatique : ça a toujours été un type destiné à des calculs pas nécessairement exacts. Quand tu calcules la distance en kilomètres entre Brest et Vladivostok, en général tu t'en moques un peu de savoir si le quatrième chiffre après la virgule est un 3 ou un 4.
sauf que la c'est pas le 3eme ni le 4eme qui posent probleme c'est le 2eme et même le 1er après la virgules et c'est même pas suite à un calcul.. C'est après un INSERT tout simple....
Dans le principe les float sont des nombres à virgule puissance infini. Comme il faut les couper après un certain nombre de décimale on est bien obligé de faire un arrondi de la dernière décimale. Ce qui provoque ce genre de variation.

Après je ne connais pas le fonctionnement fondamentale des float mais cette variation trouve un explication mathématique qui n'est pas maitrisable.
Ok je comprend qu'il m'arrondisse 184885.1456484788564 en 184885.15
mais pourquoi arrondir 1518948.15 en 1518948.13 et surtout 12540000.25 en 12540000.00
Je pense que c'est du à une conversion (de base10 vers floatant ?) qui provoque ce phénomène.
Si tu veux vraiment comprendre le phénomène libre à toi de te documenter sur l'arithmétique flottante, mais c'est surtout un coup à se taper un bon mal de crâne...

La principale chose à retenir c'est que le nombres flottants ne sont pas précis et qu'il vaut mieux favoriser le type "Double" dans ton cas d'utilisation.