IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Select avec FLOAT en condition


Sujet :

MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut Select avec FLOAT en condition
    Bonjour,
    Je me pose des questions quant aux réponses de deux requêtes.
    J'ai une table comportant des nombres avec quelques chiffres aprés la virgule (0.002682 par ex). La colone comportant ces nombres est une colone de FLOAT.

    Quand je fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Matable WHERE nb= 0.002682;
    je n'obtiens aucun resultat pourtant il y a bien un nb=0.002682 dans ma table...

    Mon autre probléme porte sur une requête avec les même valeurs mais en utilisant un BETWEEN.
    Je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Matable WHERE nb BETWEEN 0.023 AND 0.023;
    Là encore, je n'obtiens aucun resultat pourtant il y a bien un nb=0.023 dans ma table...
    Par contre si je lance la requete avec un entier (111 par ex), elle retourn bien un resutat.

    Quelqu'un aurait-il une réponse à ces comportement?

    Merci.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Float est un type de données approximatif : il ne stocke pas la valeur exacte, mais une valeur très proche.
    A l'affichage, votre client affiche 0.002682, mais la colonne contient peut-être 0.0026823, ce qui explique que la condition ne soit pas satisfaite.

    Vous devriez retrouver votre ligne avec cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Matable WHERE nb BETWEEN  0.002681  AND 0.002683;

    Que stocke cette colonne, pourquoi avoir mis du float et non du décimal ?

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour et merci pour votre réponse.
    Float est un type de données approximatif : il ne stocke pas la valeur exacte, mais une valeur très proche.
    A l'affichage, votre client affiche 0.002682, mais la colonne contient peut-être 0.0026823, ce qui explique que la condition ne soit pas satisfaite.
    Je viens d'essayer en ajoutant un nb=0.00123456.
    J'ai bien ce nombre affiché dans la base. Ce que je ne comprend pas c'est que si ce nombre est aproximatif, ça ne devrait pas être la valeur exact que j'ai rentré?

    SELECT * FROM Matable WHERE nb BETWEEN 0.002681 AND 0.002683;
    Effectivement je retouve bien ma ligne en faisant ça. En fait les 2 valeurs du BETWEEN sont rentrées à travers 2 inputs. L'utilisateur rentrera donc 0.002682 et 0.002682 .

    Que stocke cette colonne, pourquoi avoir mis du float et non du décimal ?
    Elle comporte simplement des nombres avec 5 ou 6 chiffres aprés la virgule.
    J'ai pris float car c'était le seul type que je connaissais pour les nombres à virgule, je ne connaissais pas l'existence de decimal.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    decimal et float diffèrent sur certains points rendant leur comportement parfois très différents.

    Le choix doit se faire en fonction de la nature des données que la colonne stockera (décimal va arrondir le résultat de certains calculs) et des opérations que vous voudrez effectuer dessus.

    Dans votre cas, passer en decimal serait peut être une solution si toutefois les caractéristiques de decimal conviennent à votre besoin et à votre utilisation de cette donnée.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Très bien, je vais donc regarder le comportement de DECIMAL et voir si il peut convenir dans mon cas.

    Merci!

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut flavors.

    Quand on fait de la gestion et que l'on a besoin de calculs exactes, on utilise le type DECIMAL.
    Si l'on fait des calcules scientifiques, où la précision est approximative, on utilise FLOAT ou DOUBLE.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour,
    Merci pour l'explication.
    Je suis passé au type DECIMAL, la seule point noir, c'est qu'il faut définir la taille.

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut flavors.

    Citation Envoyé par Flavors
    le seule point noir, c'est qu'il faut définir la taille.
    En quoi est-ce négatif de définir la taille de ton type decimal ?

    Si tu travailles en €uro, il suffit de mettre par exemple : "DECIMAL(M, D)", où M peut aller de 1 à 65 et D de 0 à 30.
    Donc en mettant "DECIMAL(20, 2)", tu as assez de place pour stocker les calculs dans cette monnaie.
    C'est-à-dire 2 chiffres pour la partie décimale, et 18 chiffres pour la partie entière, ce qui fait bien 20 chiffres au total.
    Auquel il faut ajouter le signe "+" ou "-" et la virgule.

    Dans cet exemple, cela représente un nombre sous ce format : "+999 999 999 999 999 999,99".
    Soit moins de 1 milliard de milliard ou encore un million de billion, soit un trillion.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Dans mon cas la range va de 0 chiffres à 10 chiffres aprés la virgule.
    Dans le cas où je rentre 1, je me retrouve avec 1.0000000000.
    C'est ce que je voulais dire en parlant de "point noir".

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut Flavors.

    Je ne voie rien d'anormal dans ce que tu me décrits.

    Je pense que tu confonds le stockage d'un nombre avec son affichage.
    MySql ne traite que le stockage. Pour l'affichage, tu dois traiter cela en php.
    Essaye de jeter un coup d'oeil sur Money_format : http://php.net/manual/fr/function.money-format.php
    Il doit exister d'autres fonctions php pour formater le nombre à l'affichage selon ta convenance.
    Et rien ne t'empêche de créer ta propre fonction pour ne conserver que les chiffres utiles après la virgule.

    Sinon, que représente ce nombre ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SELECT avec valeur de retour soumises a condition
    Par Clorish dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/12/2007, 21h26
  2. Select avec Condition et Valeurs Introduites
    Par faressam dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 16/08/2007, 14h50
  3. Réponses: 4
    Dernier message: 20/06/2006, 11h02
  4. [HyperFile] requete de selection avec condition de comptage
    Par pierre.zelb dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 16/02/2006, 10h20
  5. Réponses: 6
    Dernier message: 08/06/2004, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo