Datadis
Messages postés8Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 1 décembre 2004
-
18 oct. 2004 à 16:25
FredArmoni
Messages postés153Date d'inscriptionvendredi 2 mai 2003StatutModérateurDernière intervention 2 avril 2010
-
6 mai 2005 à 12:50
Bonjour à vous tous...
Peut-être quelqu'un va t'il trouver une réponse à ce bug lié aux décimales dans Foxpro (testé en version 7, 8 et 9).
par exemple
?63.2250000000000000000 affiche 63.2250000000000000000
Foxpro fait la même "erreur" entre 64 et 81... allez comprendre pourquoi !!!!
De ce fait, la fonction round() pose aussi problème, en effet
? round(63.2250000000000000000,2) donne 63.23
? round(64.2250000000000000000,2) donne 64.22
par contre, si on limite les décimales à 10, aucun problèmes
? round(round(64.2250000000000000000,10),2) donne 64.23
J'ai remarqué ce phénomène uniquement entre 64 et 81. Les tests peuvent sembler tordu, mais dans mon domaine, on a souvent besoin de pus de 10 décimales pour travailler.
FredArmoni
Messages postés153Date d'inscriptionvendredi 2 mai 2003StatutModérateurDernière intervention 2 avril 2010 18 oct. 2004 à 18:09
tu peux faire ce test dans n'importe quel langage, tu auras le même résultat. C'est le défaut des valeurs numériques à virgule flottante... le double :
double 15 digits représentatifs.
double long 19 digits représentatifs.
[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox MS MVP VFP
Datadis
Messages postés8Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 1 décembre 2004 18 oct. 2004 à 18:23
oui, mais pourquoi seulement avec 4, entre 64 et 81, entre 1024 et 1310, et enore plus loin (je n'ai testé qu'avec les valeurs entre 1 et 10000 ?
Les autres valeur, même en virgule flottante sont correctes.
En passant, si dans l'analyseur de requete de SQL tu tapes
PRINT ROUND(64.2250000000000000000,2) il affiche la bonne valeur, soit... 64.230000000000000000
Vous n’avez pas trouvé la réponse que vous recherchez ?
* EXPLAIN
* you can look that the value stored is a approximation of I.225,
* when the value is < I.225, the direct round fail
LOCAL i,y,z
CLEAR
SET DECIMALS TO 0
FOR i = 1 TO 4
y = i + .2250000000000
z = i + .23
?i,ROUND(Y,12),(y-I)*10000000000000,ROUND(y,2)<>z,ROUND(ROUND(y,12),2)<>z
NEXT
* then the solution is simple if you known the left zero position,
* otherwise you have to found it !!!!!
LOCAL i,y,z
CLEAR
STRTOFILE("","c:\test.txt",0)
FOR i = 1 TO 100000
y = i + .225000000000000
z = i + .23
IF ROUND(ROUND(y,3),2)<>z THEN
STRTOFILE(STR(i)+CHR(13)+CHR(10),"c:\test.txt",1)
ENDIF
NEXT
MODIFY FILE "c:\test.txt"
[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox MS MVP VFP