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

Bases de données Delphi Discussion :

ClientDataset et le champ Float


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut ClientDataset et le champ Float
    Bonjour,

    J'ai un bug assez bizarre avec les ClientDataSet et vous pouvez faire le test vous-mêmes.
    Dans une table Oracle ayant un champ Number (Float), en copiant les données sur un CliantDataSet je me suis rendu compte que j'avais un probleme avec une valeur en particulier: 60.8!!! Eh oui, quand je fais un locate ou un filtre sur le champ avec cette valeur là, ca ne me retourne rien meme si ca existe dans la table. Tout est ok avec 60.9, 67.8, ou toutes les autres valeurs, sauf .... 60.8!!

    Je sais que c'est fou mais c'est pourtant vrai et mes collegues n'ont été convaincus qu'une fois les tests effectués devant eux.

    ::

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Je pense surtout que c'est un problème classique d'arrondi...

    Comment est codé un float sous Oracle ?
    Que renvoie un select sur cette valeur * 10000 ?
    Philippe.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,

    Je pense surtout que c'est un problème classique d'arrondi...

    Comment est codé un float sous Oracle ?
    Que renvoie un select sur cette valeur * 10000 ?
    Sur la requete (donc acces direct a la table et non au CDS), les résultats sont cohérents et ça me retourne les bonnes valeurs. Pour le select Valeur *10000, ca me retourne 608000.

    Sinon, si c'est juste une question d'arrondis, pourquoi le filtre me retourne les bons résultats pour toutes les autres valeurs?

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Ben_Le_Cool Voir le message
    Sur la requete (donc acces direct a la table et non au CDS), les résultats sont cohérents et ça me retourne les bonnes valeurs. Pour le select Valeur *10000, ca me retourne 608000.

    Sinon, si c'est juste une question d'arrondis, pourquoi le filtre me retourne les bons résultats pour toutes les autres valeurs?
    C'est un problème de précision : la valeur 60,8 ne peut s'exprimer exactement, mais seulement par une valeur approchée quand on utilise le type float.
    Ensuite, il y a au cours du traitement un arrondi de la valeur qui est fait quelque part...

    Pour information, en utilisant le type float sur firebird et cette même valeur, j'obtiens depuis IBExpert :
    select mavaleur affiche 60,800
    select round(mavaleur * 10000) affiche 608000,000
    select round(mavaleur * 1000000) affiche 60799999,000

    j'obtiens dans le clientdataset 60,7999992370605.

    Le float du clientdataset est en réalité un double, plus précis donc, et laisse sur certains cas transparaitre la valeur effective et pas l'arrondi.
    Philippe.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    C'est un problème de précision : la valeur 60,8 ne peut s'exprimer exactement, mais seulement par une valeur approchée quand on utilise le type float.
    Ensuite, il y a au cours du traitement un arrondi de la valeur qui est fait quelque part...

    Pour information, en utilisant le type float sur firebird et cette même valeur, j'obtiens depuis IBExpert :
    select mavaleur affiche 60,800
    select round(mavaleur * 10000) affiche 608000,000
    select round(mavaleur * 1000000) affiche 60799999,000

    j'obtiens dans le clientdataset 60,7999992370605.

    Le float du clientdataset est en réalité un double, plus précis donc, et laisse sur certains cas transparaitre la valeur effective et pas l'arrondi.
    Ca se peut, mais sur Oracle c'est toujours des multiple de 60.8 que j'ai comme valeurs.
    Donc en résumé, la seule solution serait de convertir ce champ en string si je veux faire des locate ou filtre dessus?

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Si tu as toujours des champs avec 2 chiffres après la virgule dans ton clientdataset prend un currency au lieu d'un float (single/double)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Si tu as toujours des champs avec 2 chiffres après la virgule dans ton clientdataset prend un currency au lieu d'un float (single/double)
    Ce n'est pas le cas malheureusement.

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Ben_Le_Cool Voir le message
    Donc en résumé, la seule solution serait de convertir ce champ en string si je veux faire des locate ou filtre dessus?
    Au niveau de la requête SQL, j'écrirais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select MaValeur, cast(MaValeur * 10 as integer) as MaValeurFiltre from MaTable
    Comme cela, je conserve la valeur effective si besoin...
    Après j'appliquerais un filtre sur MaValeurFiltre (608 dans le cas présent) dans le clientdataset (ce sera plus efficace qu'un filtre sur des chaines de caractères)
    Philippe.

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Ben_Le_Cool Voir le message
    Ce n'est pas le cas malheureusement.
    Pour ma part j'ai toujours évité les Locate sur des champs de type float, ne serait ce que par le problème d'arrondi que l'on rencontre toujours.

    Sinon, il va falloir que tu fasses une recherche "manuelle" avec while next et CompareValue
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Index sur champs float
    Par tiboel dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/02/2008, 12h22
  2. Incrémentation d'un champ float qui bug
    Par Dev@lone dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 08/02/2008, 18h41
  3. pb d'arrondi du champs float(p)
    Par mastersoiree dans le forum SQL
    Réponses: 2
    Dernier message: 01/10/2007, 16h05
  4. [SQL SERV 2000]Problème sur champs Float
    Par Tankian dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/08/2006, 14h29
  5. [7RC3] Formatage de champs float
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 19/05/2003, 09h38

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