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 :

[MS-SQL][ADO] précision du type FLOAT


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut [MS-SQL][ADO] précision du type FLOAT
    Bonjour,

    En interrogeant ma base MS-SQL avec l'outil Microsoft "Analyseur de requête"

    select top 1 Valeur1
    from MaTable

    donne le résultat : 134.543277 (c'est la valeur exacte stockée dans le champ Valeur1 de MaTable)


    En interrogeant la même base avec la même requête avec Delphi via ADO:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Function GetValeur:Real;
    Var mValeur : Real;
    Begin
      Qry1.active := false;
      Qry1.Sql.Clear;
      Qry1.Sql.Add('select top 1 Valeur1 from MaTable');
      Qry1.active := true;
      Result := Qry1.Fields[0].AsFloat;
      Qry1.active := false;
    End;
    La fonction GetValeur me retourne 134.5433 !!!

    Elle arrondit à la 4ème décimale. Pourquoi ?

    Surtout que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Function GetValeur:Real;
    Var mValeur : Real;
    Begin
      Result := 134.543277;
    End;
    La fonction GetValeur me retourne bien 134.543277

  2. #2
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Après de longues recherches sur le net, j'ai fini par trouver ça :
    Hello Ricardo,

    Thursday, October 2, 2003, 4:40:33 PM, you wrote:

    RG> Hi all,
    RG> I'm having a problem when trying to receive a result set from SQL Server 2000 via ADO.
    RG> The table I want to read has some fields whose data type is numeric with precision : 14,6
    RG> These fields shown in the grid or in the Rave Report, just appear with 4 decimals insted of 6.
    RG> The data was wirtten correctly into SQL 2000. A Single select via Query Analizer, shows the result set as it is : 14,6 (precision).
    RG> NOTE : If I use BDE rather than ADO, everything apprears OK in both dbgrid and Rave Report.
    RG> Any Ideas with this ADO bug ?

    If you are using parameters in query, you must set precision for each
    floating point value.

    --
    Best regards,
    Beret
    Je ne suis donc pas le seul à qui ça arrive...

    Qqu'un peut-il m'expliquer la réponse de Beret ?

  3. #3
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Ca y'est, après pratiquement 1 journée où je n'ai fait que ça, j'ai fini par trouver.
    Le problème venait de la propriété TADOQuery.EnableBCD dont la valeur par défaut est TRUE. Il suffit de la passer à FALSE, et le problème disparaît.
    C'est vraiment tout c*n. Mais franchement, une journée pour trouver ça : Les boules !

    Ce que dit l'aide Delphi sur cette propriété :
    Citation Envoyé par Monsieur Borland
    Description

    Utilisez la propriétéEnableBCD pour spécifier comment les champs sont associés àdes classes de champ.Si EnableBCD a la valeur true (la valeur par défaut)les champs adDecimal et adNumeric sont associés àla classe TBCDField quand les objets champ sont créés.Si EnableBCD a la valeur false,les champs sont associés àla classe TFloatField.

    EnableBCD détermine si les champs numériques et décimaux sont convertis en valeurs àvirgule flottante ou en valeurs décimales codées binaire (BCD).Les valeurs BCD éliminent les erreurs d'arrondi associées àl'arithmétique àvirgule flottante (du type 3 *(2/3)donnant 2,00000000001).

    Si des objets champ persistant sont utilisés (comme ceux créés en employant l'éditeur de champs),la classe de champ associée àun champ donnépeut contredire la valeur de EnableBCD.Ainsi,trois champs numériques de la même table peuvent,par exemple,être représentés,respectivement,par un TFloatField,un TBCDField et un TVariantField indépendamment de la valeur de EnableBCD.Pour une plus grande flexibilité,sélectionnez champ par champ la classe de champ àutiliser.

    Remarque : Pour les valeurs numériques ayant plus de quatre chiffres àdroite de la virgule,il est généralement préférable d'utiliser TFloatField .En effet,TBCDField emploie le type de données monétaire qui utilise quatre chiffres fixes après la virgule.

    Remarque : Pour les champs contenant de très grands nombres ayant plus de 19 chiffres significatifs,vous pouvez utilisez les objets champ persistant TVariantField.Les classes TFloatField et TBCDField n'ont pas une capacitésuffisante pour des champs de cette taille.TVariantField permet la lecture et l'écriture de données de champ sous forme de chaîne ce qui évite la perte de données due àune capacitéinsuffisante.Par contre,il n'est pas possible d'effectuer des opérations arithmétiques sur des nombres manipulés via un objet TVariantField.
    Perso, je trouve ça un peu fort de mettre cette propriété à TRUE par défaut. Quand je choisis un type FLOAT, c'est que j'ai besoin d'un FLOAT. Sinon, je choisis un CURRENCY !

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

Discussions similaires

  1. Précision du type float
    Par SAM_92 dans le forum Langage
    Réponses: 8
    Dernier message: 26/12/2014, 14h04
  2. Type Float dans base de données SQL SERVER
    Par BYALI dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/03/2008, 11h05
  3. Réponses: 5
    Dernier message: 10/05/2006, 15h47
  4. [MS SQL] Est il possible de forcer la précision du type REAL
    Par TEXMEX dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/04/2006, 17h31
  5. Précision du type float
    Par cj227854 dans le forum C
    Réponses: 5
    Dernier message: 02/11/2005, 20h54

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