Page 1 sur 1

problème de décimale

Publié : dim. 06/juil./2008 16:53
par kwandjeen
Bonjour je limite mes décimales à 2 chiffres après la virgule et je constate un petit bug ou une erreur de ma part peut être.

Lorsque mon nombre vaut 123.1 alors la PB affecte la valeur 123.0999999999 c'est un peu gênant.

123.11 fonctionne bien par contre

en fait j'ai besoin de limiter en décimale et ma fonction tombe à l'eau à cause de ceci.

Code : Tout sélectionner

Procedure.d nb_decimale(nombre.d,nb_dec.l)
Protected valeur.d
  If nb_dec>0
    valeur = (Int(nombre*(Pow(10,nb_dec))))/(Pow(10,nb_dec))
  Else
    valeur = Int(nombre)
  EndIf
ProcedureReturn valeur
EndProcedure

For i=0 To 5
  Debug nb_decimale(123.12345,i)
Next
J'ai du louper un truc, j'attends vos conseils :D

Publié : dim. 06/juil./2008 17:02
par kwandjeen
Bon je vais me débrouiller avec les string comme ça concerne l'affichage de temps dans un tableau.

Code : Tout sélectionner

Procedure.s nb_decimale(nombre.d,nb_dec.l)
Protected valeur.s
  If nb_dec>0
    valeur = StrD(Int(nombre*(Pow(10,nb_dec)))/(Pow(10,nb_dec)))
    position = FindString(valeur,".",1)
    valeur = Left(valeur,position+nb_dec)
  Else
    valeur = Str(Int(nombre))
  EndIf

ProcedureReturn valeur
EndProcedure

For i=0 To 5
  Debug nb_decimale(123.1,i)
Next
Mais s'il y a des explication je suis preneur :)

Publié : dim. 06/juil./2008 17:48
par comtois

Code : Tout sélectionner

For i=0 To 5
  Debug StrF(123.1,i)
Next

Publié : dim. 06/juil./2008 19:48
par djes
Ca n'est pas un bug de PB, c'est une limitation matérielle des microprocesseurs en général, qui ne peuvent faire avec le binaire qu'une approximation des nombres flottants (à virgules). On en a déjà parlé très souvent, et c'est dans la doc. Il est cependant possible d'augmenter la précision de multiples façons.

Publié : dim. 06/juil./2008 22:51
par kwandjeen
Merci comtois j'aurai du chercher un peu mieux dans la doc ^^.

C'était bien une question c.. mais ça anime le forum :oops: