Je n'arrive pas à tronquer un nombre, c'est surement très bête mais j'y arrive pas...
Code : Tout sélectionner
a=2.99999
Debug FormatNumber(a, 2)
Debug StrD(a, 2)
Code : Tout sélectionner
3.00
3.00
C'est quoi l'opposé de la fonction Round()??
Code : Tout sélectionner
a=2.99999
Debug FormatNumber(a, 2)
Debug StrD(a, 2)
Code : Tout sélectionner
3.00
3.00
Code : Tout sélectionner
procedure.s formatd(va.d,nbdec)
va$=strd(va)
procedurereturn left(va$,FindString(va$,".")+nbdec)
endprocedure
a.d=2.99999
debug formatd(a,2)
debug formatd(a,3)
Code : Tout sélectionner
a.f = 2.99999
Debug a
un contre exemple avec ce code qui montre que l'arrondit de 2.51999 sera 2.52a.f = 2.99999
Debug a
Debug StrF(a, 2)
Code : Tout sélectionner
a.f = 2.51999
Debug a
Debug StrF(a, 2)
Code : Tout sélectionner
a.f=2.99999
Debug a
wikipedia a écrit :Précautions d'emploi
Les calculs en virgule flottante sont pratiques, mais présentent divers désagréments, notamment :
leur précision limitée, qui se traduit par des arrondis (dus aux opérations, ainsi qu'aux changements de base implicites) qui peuvent s'accumuler de façon gênante. En particulier, la soustraction de deux nombres très proches et entachés d'erreur provoque une grande perte de précision relative : on parle de cancellation (plus précisément, cancellation catastrophique) ;
une plage d'exposants limitée, autorisant une certaine dynamique, mais pouvant donner lieu au-delà à des débordements (overflows) lorsque le résultat d'une opération est plus grand, en valeur absolue, que la plus grande valeur représentable, et à des sous-passements (underflows), lorsqu'un résultat est plus petit, en valeur absolue, que le plus petit flottant normalisé positif, puis à des résultats n'ayant plus aucun sens.
Il est par exemple tentant de réorganiser des expressions en virgule flottante comme on le ferait d'expressions mathématiques. Cela n'est cependant pas anodin :
les calculs en virgule flottante, contrairement aux calculs sur les réels, ne sont pas associatifs. Par exemple, avec une précision relative de 3 chiffres décimaux, on aurait (0,999+0,0004)+0,0004 = 0,999 + 0,0004 = 0,999 mais 0,999+(0,0004+0,0004)=0,999+0,0008 = 1,000 ; on dit qu'il y a absorption lorsqu'un opérande comme 0,999 absorbe ainsi un plus petit non nul ;
l'évaluation des expressions est parfois faite en précision étendue, avec retour à la précision normale lors du rangement des valeurs ; dans ce cas, on peut avoir une meilleure précision en éliminant certaines variables intermédiaires peu utiles, et les rangements associés.
Ceci s'explique par la manière dont sont codés les floats. Dans ce cas, 2.99998998641968 tombe rond (pour lui) alors que 2.99999000000000000 non. Nous sommes en base 2 et non en base 10, il ne faut pas l'oublier.cowpowah a écrit :Merci PAPIPP! ça fonctionne
@falsam: au contraire je cherche à tronquer sans arrondir
accessoirement:me donne 2.99998998641968Code : Tout sélectionner
a.f=2.99999 Debug a
Enfin, je trouve bizarre qu’il y ait la fonction Round() et pas de fonction Truncate(), pas même en option dans une autre fonction, particulièrement FormatNumber()...