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

 Firebird Discussion :

[delphi] arrondi désarrondi ??


Sujet :

Firebird

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 51
    Points : 30
    Points
    30
    Par défaut [delphi] arrondi désarrondi ??
    Bonjour !

    J'ai un champs prix FLOAT que je dois renseigner moi meme. J'écris dans ce champs 12,4 et lorsque j'insert dans ce champs la valeur 12,4 et que je poste la donnée, tout marche.... Parcontre quand je reviens, le champs n'est plus égal à 12,4 mais à 12,399999999999999....

    Que se passe t - il ?

    Merci

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Il se passe ce qu'il doit se passer avec un FLOAT. Les floats sont à utiliser pour les calculs scientifiques et non pour les chiffres de type compta...

    C'est lié à la façon d'encoder le float en binaire.
    Si vous arrondissez la valeur lue vous retomberez à votre 12.4. Mais ce n'est pas la solution...

    Donc pour en revenir à votre probleme qui n'en est pas un, si vous voulez enregistrer des chiffres sans qu'ils soient arrondis il faut utiliser DECIMAL ou NUMERIC.

    Ce n'est pas un probleme lié à interbase, mais un probleme purement informatique qui est bien connu. On le retrouvera donc dans tous les languages que se soit Delphi ou autre.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 51
    Points : 30
    Points
    30
    Par défaut
    merci ! j'ai mis un decimal ça marche au poil !!

  4. #4
    fab
    fab est déconnecté
    Membre du Club
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    Salut,

    Je tape directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select 
      12.05 - 12 , 
      cast((12.05 - 12) as decimal(10,2)),
      7.95 -7 
    from 
      travaille 
    where 
      numtrav = 547
    et j'obtiens :

    0.0500000000000070 | 0.0500000000000070 | 0.95

    As-tu une explication ???? (et une solution...)

    Merci

  5. #5
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    avec quel sgbdr ? Sous firebird 1.5 ça fonctionne très bien et le résultat est correct.

    J'obtiens bien 0.05|0.05|0.95

    @+

  6. #6
    fab
    fab est déconnecté
    Membre du Club
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    La version que j'utilise c'est Interbase Server 5.5.0.742.

    Pour revenir à mon problème, je cré un champ temporaire dans ma table en decimal (15,2) lorsque je le cast en char(5) je retrouve une parfois une 3ème decimale
    exemple 7.77 -> 7.767.

    Je ne trouve pas de fonction d'arrondi. Je suis dans la m...

    En fait je veux convertir des heures en mn en heures en centieme, mais ces heures en mn sont stockées sous un type char(5).

    Quelqu'un a t-il une idée ? Merci

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Points : 376
    Points
    376
    Par défaut
    il n'y a aucune fonction d'arrondie toute faite.

    2 solutions: 1) par multiplication/cast/division ou via une udf

    pour la convertion des heures stockées dans une chaîne: il faut extraire les données de la chaîne (encore des udf) convertir en valeur et le reste sont des multiplications/divisions.

Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. Réponses: 1
    Dernier message: 13/05/2002, 09h19
  3. [Kylix] Migration delphi -> kylix
    Par Christian dans le forum EDI
    Réponses: 1
    Dernier message: 03/04/2002, 22h50
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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