Page 1 sur 1

Question sur StrD

Publié : sam. 15/mai/2010 12:03
par lepiaf31
Bonjour,
voilà j'ai un petit problème avec la fonction StrD(Valeur.d [, NombreDeDecimales]). La doc dit:
Un nombre maximum de décimales peut être spécifié. Le nombre sera arrondi si 'NombreDeDecimales 'est plus petit que le nombre de décimales existantes de 'Valeur.d '.
Donc si je ne précise pas NombreDeDecimales, la fonction devrait me renvoyer le nombre maximum de décimales, non ?

Regardez ce code:

Code : Tout sélectionner

var.d = 0.123123123123123
Debug StrD(var) ;renvoi 0.1231231231
Debug StrD(var, 15) ;renvoi bien 0.123123123123123
Je ne comprends pas pourquoi quand je ne précise pas NombreDeDecimales, la fonction ne me renvoi pas toutes les décimales ...

Si quelqu'un pouvait éclairer ma lanterne.

Merci d'avance !

Re: Question sur StrD

Publié : sam. 15/mai/2010 14:26
par Backup
peut etre que tout simplement Fred a voulu mettre une valeur par defaut a 10 decimales .. :)

Re: Question sur StrD

Publié : sam. 15/mai/2010 14:28
par lepiaf31
Arf mais ça m'arrange pas moi, parce que je ne connais pas à l'avance le nombre de décimales que contiendra la variable. Y a-t-il un moyen pour connaitre le nombre de décimales d'un Double ?

Re: Question sur StrD

Publié : sam. 15/mai/2010 14:50
par SPH
lepiaf31 a écrit :Arf mais ça m'arrange pas moi, parce que je ne connais pas à l'avance le nombre de décimales que contiendra la variable. Y a-t-il un moyen pour connaitre le nombre de décimales d'un Double ?
Assez souvent, il n'y a pas un nombre fini de décimal...
Réfléchis : 7/3=2.333333....... Donc, là, fred etait sensé faire quoi ? Ouvrir 100000 longs pour stocker les "3" ?

Re: Question sur StrD

Publié : sam. 15/mai/2010 14:56
par Le Soldat Inconnu
oui, c'est une erreur de l'aide (j'avais fais un rapport de bug a ce sujet)

par défaut, c'est à 10 décimale après la virgule.

Pour arrondir un chiffre à X nombre significatif, voici un code :

Code : Tout sélectionner

Procedure.s Arrondi(Valeur.d, Precision = 12)
	; Arrondi de la valeur
	Precision - 1
	Limite.d = 1
	While Abs(Valeur) >= Limite * 10 And Precision > 1
		Limite * 10
		Precision - 1
	Wend
	While Abs(Valeur) < Limite
		Limite / 10
		Precision + 1
	Wend
	ProcedureReturn RTrim(RTrim(StrD(Valeur, Precision), "0"), ".")
	
EndProcedure

Re: Question sur StrD

Publié : sam. 15/mai/2010 15:01
par lepiaf31
D'accord merci LSI =)
Donc si je comprends bien dans tous les cas on est obligé donner la précision que l'on souhaite avoir ?

EDIT: Bon alors ya un truc que je pige pas va falloir m'expliquer :

Code : Tout sélectionner

Procedure.s Arrondi(Valeur.d, Precision = 12)
   ; Arrondi de la valeur
   Precision - 1
   Limite.d = 1
   While Abs(Valeur) >= Limite * 10 And Precision > 1
      Limite * 10
      Precision - 1
   Wend
   While Abs(Valeur) < Limite
      Limite / 10
      Precision + 1
   Wend
   ProcedureReturn RTrim(RTrim(StrD(Valeur, Precision), "0"), ".")
   
EndProcedure

var.d = 2.12345678
Debug StrD(var, 20)
Debug var
Debug Arrondi(var, 20)
et voilà ce que j'obtiens:
2.12345678000000020000
2.1234567800000002
2.1234567800000002
Comment ça se fait qu'il y a 000000002 qui apparait ? J'imagine que ça a un rapport avec la manière dont sont stocké les nombre flottants en mémoire mais j'aimerais quand meme qu'on m'explique ^^

Re: Question sur StrD

Publié : sam. 15/mai/2010 15:23
par SPH
Oui, récement, j'ai aussi noté ce bug :!:

Re: Question sur StrD

Publié : sam. 15/mai/2010 15:39
par Le Soldat Inconnu
la précision maxi est de 17 nombre significatif soit 1.2345678901234567

ton 2 à la fin est sur le dernier nombre significatif possible. Et un nombre flottant ne tombe jamais juste. les 2-3 derniers chiffres significatifs peuvent s'écarter du résultat exact après plusieurs opérations.
La faute au binaire.
0.5 = %0.1 tombe juste
0.75 =%0.11 aussi car ce sont des valeurs binaires
0.3 par contre non

Le mieux est d'arrondir à 14 chiffre significatif grand maximum

Re: Question sur StrD

Publié : sam. 15/mai/2010 15:41
par lepiaf31
D'accord merci pour ces précisions =)