OVH Cloud OVH Cloud

[WD 5.5] Manipulation des nombres

4 réponses
Avatar
pmoune
Je rencontre 2 phénomènes tres etrange :

1 - Je travaille avec des nombres petits qui sont déclarées comme reel
dans le code. de tant en temps, Windev me les met en notation
scientifique. C'est a dire que si je regarde ma variable sous le
debogeur, elle ne s'affiche pas comme 0.008 mais comme 8e-02. si je
fais alors par exemple a*b et que a=5 et b=8e-02, et bien j'ai une
erreur de syntaxe.

2 - Problème beaucoup plus grave et qui se produit de facon aleatoire.
Soit dans un fichier 2 champs reels. Lc.Qte et Lc.QteL ces deux champs
sont renseignés dans une table de saisie avec comme masque 999 999.99
on ne peut donc pas saisir plus de 2 decimales. une fois stocké dans
le fichier et rappelé pour traitement voici ce que j'ai de temps en
temps (Une fois toutes les 200 ajouts dans le fichier)

Lc.Qte1 est egale à 178.5
Lc.Qte1L est egal à 178.5
Lc.Qte1-Lc.Qte1L donne 125e-05 et pas 0

Mieux !

Lc.Qte1*1000000 donne 178500000
Lc.Qte1L*1000000 donne 178500000

Lc.Qte1*1000000-Lc.Qte1L*1000000 donne 0.125 !!!!!.

Je rappelle que ces champs sont saisies dans une table avec 2
decimales et ne sont pas issus d'un calcul genre HT vers TTC. D'ou
vinnent ces decimales !!!

Une idée, car je vais mal finir avec mon client.

Merci

4 réponses

Avatar
jacques.trepp
Philippe MOUNIER a pensé très fort :
Je rencontre 2 phénomènes tres etrange :

1 - Je travaille avec des nombres petits qui sont déclarées comme reel
dans le code. de tant en temps, Windev me les met en notation
scientifique. C'est a dire que si je regarde ma variable sous le
debogeur, elle ne s'affiche pas comme 0.008 mais comme 8e-02. si je
fais alors par exemple a*b et que a=5 et bŽ-02, et bien j'ai une
erreur de syntaxe.

2 - Problème beaucoup plus grave et qui se produit de facon aleatoire.
Soit dans un fichier 2 champs reels. Lc.Qte et Lc.QteL ces deux champs
sont renseignés dans une table de saisie avec comme masque 999 999.99
on ne peut donc pas saisir plus de 2 decimales. une fois stocké dans
le fichier et rappelé pour traitement voici ce que j'ai de temps en
temps (Une fois toutes les 200 ajouts dans le fichier)

Lc.Qte1 est egale à 178.5
Lc.Qte1L est egal à 178.5
Lc.Qte1-Lc.Qte1L donne 125e-05 et pas 0

Mieux !

Lc.Qte1*1000000 donne 178500000
Lc.Qte1L*1000000 donne 178500000

Lc.Qte1*1000000-Lc.Qte1L*1000000 donne 0.125 !!!!!.

Je rappelle que ces champs sont saisies dans une table avec 2
decimales et ne sont pas issus d'un calcul genre HT vers TTC. D'ou
vinnent ces decimales !!!

Une idée, car je vais mal finir avec mon client.

Merci



c'est un problème recurrent avec les réels. Il faut utiliser des
monétaires :/
ou bien utiliser des arrondis.
cordialement

--
Ceci est une signature automatique de MesNews.
Site : http://mesnews.no-ip.com
Avatar
DAIREAUX Jean-Baptiste
"Philippe MOUNIER" a écrit dans le message de
news:
Je rencontre 2 phénomènes tres etrange :

1 - Je travaille avec des nombres petits qui sont déclarées comme reel
dans le code. de tant en temps, Windev me les met en notation
scientifique. C'est a dire que si je regarde ma variable sous le
debogeur, elle ne s'affiche pas comme 0.008 mais comme 8e-02. si je
fais alors par exemple a*b et que a=5 et bŽ-02, et bien j'ai une
erreur de syntaxe.

2 - Problème beaucoup plus grave et qui se produit de facon aleatoire.
Soit dans un fichier 2 champs reels. Lc.Qte et Lc.QteL ces deux champs
sont renseignés dans une table de saisie avec comme masque 999 999.99
on ne peut donc pas saisir plus de 2 decimales. une fois stocké dans
le fichier et rappelé pour traitement voici ce que j'ai de temps en
temps (Une fois toutes les 200 ajouts dans le fichier)

Lc.Qte1 est egale à 178.5
Lc.Qte1L est egal à 178.5
Lc.Qte1-Lc.Qte1L donne 125e-05 et pas 0

Mieux !

Lc.Qte1*1000000 donne 178500000
Lc.Qte1L*1000000 donne 178500000

Lc.Qte1*1000000-Lc.Qte1L*1000000 donne 0.125 !!!!!.

Je rappelle que ces champs sont saisies dans une table avec 2
decimales et ne sont pas issus d'un calcul genre HT vers TTC. D'ou
vinnent ces decimales !!!

Une idée, car je vais mal finir avec mon client.

Merci



A savoir :
avec des réel ->
a=x
b=x
a-b = ?? -> 0 plus ou moins k avec k petit.

donc
si a-b=0 alors
n'arrive jammais
sinon
arrive toujour
fin

faire
si abs(a-b)<=k alors
info("a=b")
sinon
info("a<>b")
fin

ce n'est pas du a windev mais à la réprésentation des réel en machine.

J.B.D.
Avatar
pmoune
Merci pour le tuyau je n'avais jamais rencontré ce comportement. Mais
par contre je dois donner quoi comme valeur à k sachant que mes
clients sont libres de choisir le nombre de décimales avec lesquelles
ils désirent travailler.

Merci de ta réponse

Phil

"DAIREAUX Jean-Baptiste" wrote in message news:<4176939a$0$28798$...
"Philippe MOUNIER" a écrit dans le message de
news:
> Je rencontre 2 phénomènes tres etrange :
>
> 1 - Je travaille avec des nombres petits qui sont déclarées comme reel
> dans le code. de tant en temps, Windev me les met en notation
> scientifique. C'est a dire que si je regarde ma variable sous le
> debogeur, elle ne s'affiche pas comme 0.008 mais comme 8e-02. si je
> fais alors par exemple a*b et que a=5 et bŽ-02, et bien j'ai une
> erreur de syntaxe.
>
> 2 - Problème beaucoup plus grave et qui se produit de facon aleatoire.
> Soit dans un fichier 2 champs reels. Lc.Qte et Lc.QteL ces deux champs
> sont renseignés dans une table de saisie avec comme masque 999 999.99
> on ne peut donc pas saisir plus de 2 decimales. une fois stocké dans
> le fichier et rappelé pour traitement voici ce que j'ai de temps en
> temps (Une fois toutes les 200 ajouts dans le fichier)
>
> Lc.Qte1 est egale à 178.5
> Lc.Qte1L est egal à 178.5
> Lc.Qte1-Lc.Qte1L donne 125e-05 et pas 0
>
> Mieux !
>
> Lc.Qte1*1000000 donne 178500000
> Lc.Qte1L*1000000 donne 178500000
>
> Lc.Qte1*1000000-Lc.Qte1L*1000000 donne 0.125 !!!!!.
>
> Je rappelle que ces champs sont saisies dans une table avec 2
> decimales et ne sont pas issus d'un calcul genre HT vers TTC. D'ou
> vinnent ces decimales !!!
>
> Une idée, car je vais mal finir avec mon client.
>
> Merci

A savoir :
avec des réel ->
a=x
b=x
a-b = ?? -> 0 plus ou moins k avec k petit.

donc
si a-b=0 alors
n'arrive jammais
sinon
arrive toujour
fin

faire
si abs(a-b)<=k alors
info("a=b")
sinon
info("a<>b")
fin

ce n'est pas du a windev mais à la réprésentation des réel en machine.

J.B.D.


Avatar
DAIREAUX Jean-Baptiste
k doit étre égale à la précision que tu désire par exemple :
précision 4 décimales k=0.0001

petite erreur dans le code que je t'ai donné :
si abs(a-b)<k alors //stricte avec le k egal la précision
info("a=b")
sinon
info("a<>b")
fin

Par contre pour gérer des valeur motétaire utilise le monétaire de windev
qui un entier avec une partie décimal fixe.


"Philippe MOUNIER" a écrit dans le message de
news:
Merci pour le tuyau je n'avais jamais rencontré ce comportement. Mais
par contre je dois donner quoi comme valeur à k sachant que mes
clients sont libres de choisir le nombre de décimales avec lesquelles
ils désirent travailler.

Merci de ta réponse

Phil

"DAIREAUX Jean-Baptiste" wrote in


message news:<4176939a$0$28798$...
> "Philippe MOUNIER" a écrit dans le message de
> news:
> > Je rencontre 2 phénomènes tres etrange :
> >
> > 1 - Je travaille avec des nombres petits qui sont déclarées comme reel
> > dans le code. de tant en temps, Windev me les met en notation
> > scientifique. C'est a dire que si je regarde ma variable sous le
> > debogeur, elle ne s'affiche pas comme 0.008 mais comme 8e-02. si je
> > fais alors par exemple a*b et que a=5 et bŽ-02, et bien j'ai une
> > erreur de syntaxe.
> >
> > 2 - Problème beaucoup plus grave et qui se produit de facon aleatoire.
> > Soit dans un fichier 2 champs reels. Lc.Qte et Lc.QteL ces deux champs
> > sont renseignés dans une table de saisie avec comme masque 999 999.99
> > on ne peut donc pas saisir plus de 2 decimales. une fois stocké dans
> > le fichier et rappelé pour traitement voici ce que j'ai de temps en
> > temps (Une fois toutes les 200 ajouts dans le fichier)
> >
> > Lc.Qte1 est egale à 178.5
> > Lc.Qte1L est egal à 178.5
> > Lc.Qte1-Lc.Qte1L donne 125e-05 et pas 0
> >
> > Mieux !
> >
> > Lc.Qte1*1000000 donne 178500000
> > Lc.Qte1L*1000000 donne 178500000
> >
> > Lc.Qte1*1000000-Lc.Qte1L*1000000 donne 0.125 !!!!!.
> >
> > Je rappelle que ces champs sont saisies dans une table avec 2
> > decimales et ne sont pas issus d'un calcul genre HT vers TTC. D'ou
> > vinnent ces decimales !!!
> >
> > Une idée, car je vais mal finir avec mon client.
> >
> > Merci
>
> A savoir :
> avec des réel ->
> a=x
> b=x
> a-b = ?? -> 0 plus ou moins k avec k petit.
>
> donc
> si a-b=0 alors
> n'arrive jammais
> sinon
> arrive toujour
> fin
>
> faire
> si abs(a-b)<=k alors
> info("a=b")
> sinon
> info("a<>b")
> fin
>
> ce n'est pas du a windev mais à la réprésentation des réel en machine.
>
> J.B.D.