Bonsoir,
Je fais une petite digression sur les problèmes d'arrondi avec les
nombres entiers.
Ce n'est pas très simple à comprendre, car cela résulte de la
représentation qui se fait suivant un processus de mantisse et
caractéristique (norme IEEE754).
la caractéristique (ou exposant) est la puissance de 10 et la mantisse
donne les chiffres avec le premier chiffre significatif derrière la
virgule.
Pour un nombre en simple précision, on a 32 bits, avec un bit pour le
signe, 8 pour l'exposant, et 23 pour la mantisse. Avec des puissances
de 2 sur 23 bits, on commence à avoir une incertitude sur le 7ème
chiffre, et on peut coder entre 2.10^-38 et 2.10^38 (avec le signe sur
un bit séparé)
En double précision, on est sur 64 bits. Toujours 1 pour le signe,
mais 11 pour l'exposant et 53 pour la mantisse. L'imprécision arrive
sur le 16ème chiffre et on peut coder de 2.10^-308 et 2.10^308
======================
Pour la représentation du nombre, il est logique de tout avoir sous
une forme fixe du style 130.0 et 134.4
Si on est avec des euros par exemple, on met plutôt 130.00 et 134.40 .
on obtient facilement ce qu'on veut avec un format.
Ensuite, la manipulation se fait facilement avec les expression
régulière.
a) la chaine à examiner est celle qui sort du format
b) la chaine de comparaison est (.*)\.00$
c) la chaine résultante est \1
Explication : la chaine de recherche (.*) veut dire n'importe quelle
chaine de caractère et la parenthèses permettent de la repérer par \1
(premier groupe entre parenthèses). La chaine \.00$ veut dire un point
suivi de deux 0 en fin de ligne.
Donc l'ensemble veut dire = "ranger dans le groupe 1 tout ce qui se
trouve avant la fin de ligne .00
S'il trouve la fin de ligne .00 on a un résultat avec le .00 strippé,
sinon, on a toute la chaine.
On peut aussi mettre pour la chaine de recherche (.*)\.0*$ pour
stripper un point suivi de n'importe combien de 0 après le point et en
fin de ligne. Si on veut enlever des virgules, il suffit de remplacer
le \. par , (on met le \ pour que le . qui veut dire "n'importe quel
caractère" soit "échappé" en "caractère point"
=====================
Je conseille de mettre cette manip dans une fonction à vous genre
monformat(var_cdbl) avec un résultat string
Michel Lo
BELT
45, rue Aristide Briand
92300 LEVALLOIS-PERRET
L'intégrité de ce message n'étant pas assurée sur internet, BELT ne
peut être tenue responsable de son contenu. Toute utilisation ou
diffusion non autorisée est interdite. Si vous n'êtes pas destinataire
de ce message, merci de le détruire et d'avertir l'expéditeur.
The integrity of this message cannot be guaranteed on the Internet.
BELT can not therefore be considered responsible for the contents. Any
unauthorized use or dissemination is prohibited. If you are not the
intended recipient of this message, then please delete it and notify
the sender.
Le 19 mars 08 à 19:03, Arnaud Nicolet a écrit :
Mon avis:
Format est bien, mais on ne peut pas avoir facilement une fonction
qui affiche "199.4" et "130" (pour 199.4 et 130, donc). On a soit "-
#" qui donne "199" et "130", soit "-#.0" qui donne "199.4" et
"130.0" ou alors, le pire, "-#.#" qui donne "199.4" et "130.". Mais
pour afficher les nombres à virgules avec la partie décimale et les
nombres entiers sans la virgule, il faut d'abord comparer si
x=round(x) , mais je crois que c'est même pas si simple (ça renvoie
toujours faux).
Le 19 mars 08 à 18:26 (soir), Jacques Chanliau a écrit:
Je profite de cette discussion pour vous faire part d'une petite
mésaventure qui peut vous être utile.
J'utilisais cdbl ou val pour exporter des valeurs d'une listbox
(mais le problème serait le même à partir d'un EditField) vers un
fichier excel. Les résultats sur excel étaient différents de ceux
trouvés sur RealBasic.
En effet, dès que le nombre à exporter est supérieur à 100000, il
est arrondi à une décimale: par exemple, 111111,11 donnera 111111,1.
Il est donc impératif ici d'utiliser format ("-#.00") pour obtenir
le bon résultat.
J'ai fait un rapport de bug à ce sujet, mais RB, ainsi que pas mal
de monde sur la liste américaine, m'ont répondu que c'était normal.
En remplaçant mes cdbl par format, tout fonctionne normalement.
|