begin process at 2012 02 11 06:46:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Base de données

 > 

Access

 > 

Floating point


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Floating point

lundi 7 août 2006 à 18:25:48 | Floating point

ethan_decoster

Dans une base de donnée utilisée pour un de mes programmes, j'ai des données qui ont comme type de champs la valeur reel simple. La base de donnée communique avec le programme via Ado. Donc dans la base de donnée j'ai les valeurs 26.3. Mais a l'affichage dans le programme, la valeur de ce champs est de 26.299365489 ce qui en valeur arrondie me donne 26.3.  

Mais le hic ce que je me sert de cette donnée pour en afficher d'autre. Mais comme le programme intercepte la valeur de 26.3 comme 26.299... les autres donnée ne sont donc pas affichée.  De plus c'est valeur doit etre de type numérique et non chaine de caractère parce que j'utilise le tri numérique pour ordonnancer ces données...

Le pire c'est quand je fais un query sur ma table du style select * from clc where (cas = 26.3), le query me trouve l'enregistrement.

Quelqu'un saurait me dire pourquoi la basse de donnée me donne la valeur de 26.3 alors que le programme affiche la valeur de 26.299...

Merci
Jerome
lundi 7 août 2006 à 18:52:16 | Re : Floating point

ethan_decoster

Ah oui une chose importante peut etre, la valeur de 26.3 dals la base de donnée est recupérée avec le composant DBEdit. C'est peut etre ca le probleme... Je check et vous tiens au courant...

Si quelqu'un, trouve avant moi, merci de poster vos commentaires...

Jerome
lundi 7 août 2006 à 18:57:08 | Re : Floating point

Loda

Membre Club
Réponse acceptée !
Salut,

Cela vient de la manière dont est stocké la valeur en mémoire (du PC).

Pour faire dans le simplifié, Les nombres flotant sont stocké sous la forme "scientifique" cad 'base' x 10~'Puissance' (+signe)

La base est stocké avec un nombre finit de bit (disons 15 pour l'exemple).

Donc quand tu écrit 26.3, il vas arrondire la base (263) au nombre le plus pres d'une puissance de 2 (1 à 2^15-1).

Après quand tu "relit" la valeur, il te retourne toute la précision qu'il a (26299...). Même celle que tu ne lui a pas donné.

C'est pour ça qu'il ne FAUT JAMAIS FAIRE DE TEST D'EGALITE AVEC DES FLOTANT !!!!

C'est aussi pour ça que tu peut additionner 1e-10 à une var floatant qui vaut 10e40 pendant toute une journée sans que la var ne change de valeur.

fait un test genre :

(cas < Limit + Epsilon) and (cas > limit - Epsilon)

avec un Epsilon qui vaut genre 0.002. (enfin, ça dépend de bcp de choses)

Chaque fois que possible, évite les type flotant, remplace les par des integer avec une ponderation (facteur).


"De plus c'est valeur doit etre de type numérique et non chaine de caractère parce que j'utilise le tri numérique pour ordonnancer ces données..."

je connais pas les détail de ton cas, mais il y a surement un moyen de le lire directement en floatant.

bon code,
lundi 7 août 2006 à 19:03:23 | Re : Floating point

ethan_decoster

Y pas une solution pour lire le nombre comme il est tape dans la base de donnée??
lundi 7 août 2006 à 19:05:39 | Re : Floating point

Loda

Membre Club
oui, il faut utiliser un champ string pas floatant.

ou si t'as toujours la même précision lors de la saisie, fait une routine de formatage.
mardi 8 août 2006 à 00:48:12 | Re : Floating point

ethan_decoster

Avec une chaine string, tu sais faire un tri numerique sur les donnees??
mardi 8 août 2006 à 05:22:53 | Re : Floating point

f0xi

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
utilise la virgule fixe.

26.3 = 2630/100 << depend de l'interval Min..Max des chiffres et de la precision voulue 1..n decimales

stockage en entiers : round(Float*100)

si je joue dans l'interval : 0..1000 avec precision maxi de 3 decimale, je multiplie par 1000
Fin := round(F*1000);
Fout := Fin/1000;

le tri de chaine en valeur flottante risque de faire n'importe quoi ...

en tout cas on index pas des valeurs avec des flottant justement a cause de ça.

champs ID : int / unique / auto increment / non null
champs Valeur : float / null


Croc (click me)
mardi 8 août 2006 à 11:51:04 | Re : Floating point

Loda

Membre Club
au pire des pire, fait un champs en flotant que tu utilise pour le tri et un en string pour avoir ta "saisie". (très moche)

Mais j'éviterais si j'étais toi, y a surement un moyen de résoudre ton problème en changeant deux-trois trucs dans ton system.

De toute façon, tu peux marquer 'dommage' pour faire un test d'égalité (unique) avec un flotant.
mardi 8 août 2006 à 17:45:25 | Re : Floating point

ethan_decoster

oui c'est vrai que c'est moche comme solution. J'ai fait changer le fusil d'epaule de loa sncb qui a abandonner le projet de mettre un cas intermedaire. Ex: 26 26BIS et 27 (si je les mettais en chaine de caractere) j'aurais pas eu cet ordre la. Maintenant la solution etait de garder le champs numerique mais de mettre 26 26,1 et 27 dans la base de donnée. Mais le projet a ete abandonné. Merci pour ton explication Loda j'avais pas capté cela comme ca mais c'est vrai que les float c'est de la M....

Jerome
mardi 8 août 2006 à 18:25:35 | Re : Floating point

Loda

Membre Club
de rien.

si j'ai bien compris, tu utilise la partie fractionnaire de ton float pour distinguer des cas?!

pourquoi tu n'utilise pas un champs supplémentaire ? cela te permeterait de faire ton trie facilement.

(les float c'est fait pour manipuler des valeurs floattant. faut pas s'en servire pour autre choses.)

bon code,

1 2

Cette discussion est classée dans : base, programme, donnée, valeur, floating


Répondre à ce message

Sujets en rapport avec ce message

Les fonctions pratiques des bases de donnée [ par xpmich ] bonjour, j'utilise une base de donnée Paradox sous delphy 7 !Je voudrais savoir :   - comment  réorganiser, tirer une base de donnée Paradox ?   - Com Comment tester si une base de donnée existe [ par gabs77 ] bonjour, je voudrais faire que lorsque j exécute le programme, celui ci teste ci la base de donnée existe et que si elle n existe pas le programme ne base de donnée [ par houcine_jam ] zouzousalut comment lier un programme delphi avec un programme sql? Base de donnée autonome sans serveur réseau...? [ par djynn62 ] Bonjour,Je souhaite créer un programme de gestion de carnets (dont les feuillets ont chacun un numéro différend, le tout réparti sur plusieurs personn base de donnée [ par rzc ] salut tout le monde svp est ce que vous pouvez me donné le code pour faire une sauvgarde dans une base de donnée en temps réel parce que avec le code base de données sou delphi [ par cintar3000 ] Bonjour, j'ai une base de donnée sous paradox7 quand j'insert un enregistrement et j'enregistre avec table1.post; l'enregistrement est '' enregistrer image dans base de donnée [ par sharifcrd ] sharif comment inserrer / stocker une image dans une base de donne dbase4 sous delphi7 merci problème de lenteur dans l'accès à la base de donnée en case mise à jour [ par fodilone ] J'ai réalisé une application qui permet d'enregistrer et de mettre à jour les données sous réseau. Pour cela, j'ai crée un module de données qui conti Base de donnée pour débutant [ par mabedad ] Bonjour, je suis élève en terminal S SI, et j'ai un ppe en fin d'année, nous voulons créer un logiciel de covoiturage sous delphi !!! Donc une personn recherche d'une base de donnée [ par ayadi001 ] Bonjour j'ai une application base de donnée, les tables en paradox, je veux afficher les données entre deux dates comment la requete s'écrit-il ? a


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 7,441 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales