Arrondi inverse des nombres en VBA

JPC92

XLDnaute Nouveau
Bonjour à tous

J'ai un fichier texte contenant des résultats de mesures organisé comme suit :

00001 77.47500 -119.0
00002 77.48000 -118.5
00003 77.48500 -117.4
.........

J'ai fait ce bout de programme pour récupérer les données :

Dim Numéro_Mesures As Integer, Fréquence As Single, Niveau As Single

Open Fichier For Input As #1

Do While Not EOF(1)
Input #1, Numéro_Mesures, Fréquence, Niveau
With Sheets("Données")
.Cells(Ligne, B).Value = Fréquence
.Cells(Ligne, C).Value = Niveau
End With
Ligne = Ligne + 1
' Debug.Print Numéro_Mesures, Fréquence, Niveau
Loop

Close #1

Ce qui donne un résultat curieux, Excel invente des décimales !

Exemple : Ligne 0001

Affichage de la cellule : 77,47499847
Affichage de la barre de formule : 77,474998474121

Avec Round(Fréquence, 5) : 77,47499847
Avec Format(Fréquence, "0.00000"), cela donne : 7747500
Avec FormatNumber(Fréquence, 5), cela donne : 7747500

Avec l'assistant d'importation de texte : 77.47500, résultat OK.

Comment se fait-il qu'Excel désarrondi (si l'on peut dire) dans le cas de la lecture directe du fichier ?

Configuration : Windows XP SP3 et Excel 2003.

Si quelqu'un a une explication, je suis preneur.
Merci d'avance
 

ROGER2327

XLDnaute Barbatruc
Re : Arrondi inverse des nombres en VBA

Bonsoir
À JPC92 :
(...) Comment se fait-il qu'Excel désarrondi (si l'on peut dire) dans le cas de la lecture directe du fichier ? (...) Si quelqu'un a une explication, je suis preneur. (...)
Prenez :
La représentation des nombres dans Excel (et en informatique en général) n'est pas décimale mais binaire. C'est à dire que 77.475 (décimal) que nous interprétons comme somme de multiples de puissances de dix
7 x 10 + 7 x 1 + 4 / 10 + 7 / 100 + 5 / 1000​
est interprété par la machine comme somme de puissance de deux
1 x 64 + 1 x 8 + 1 x 4 + 1 x 1 + 1 / 4 + 1 / 8 + 1 / 16 + 1 / 32 + 1 / 256 + 1 / 512 + ...
... car, même en persévérant, on n' obtient jamais exactement 77.475 par ce procédé. en fait l'écriture binaire de 77.475 (décimal) est :
1001101.01111001
la partie soulignée se répétant indéfiniment. La machine ne conçoit pas cette répétition indéfinie et tronque le résultat en considérant les 24 premiers chiffres : elle interprète 77.475 (décimal) comme
1001101.01111001100110011
qui, transcrit en écriture décimale, donne

1x64+1x8+1x4+1x1+1/4+1/8+1/16+1/32+1/256+1/512+1/4096+1/8192+1/65536+1/131072

Vous vérifierez que cette expression est exactement égale à 77,474998474121 (décimal).
À partir de là, le reste s'explique par les formatages de nombre.
Pour obtenir une meilleure transcription décimale des représentations binaires, il faudrait que le calculateur calculât sur un plus grand nombre de chiffres binaires ou fît un arrondi plus grossier du résultat.
Voilà...​
Bonne nuit !
ROGER2327
 
Dernière édition:

JPC92

XLDnaute Nouveau
Re : Arrondi inverse des nombres en VBA

Bonjour
Merci à tous les deux pour vos réponses.
Pour Roland M : J'ai essayé ta proposition, ça fonctionne ! Il est vrai qu'a la base c'est un fichier texte, je devrais avoir le réflexe chaîne de caractère même si ce sont des nombres.
Pour ROGER2327 : J'ai beau être du métier, on n'utilise plus beaucoup la représentation binaire.
Bon week-end !
 

ROGER2327

XLDnaute Barbatruc
Re : Arrondi inverse des nombres en VBA

Re pour JPC92
Pour ROGER2327 : J'ai beau être du métier, on n'utilise plus beaucoup la représentation binaire.
On n'utilise plus beaucoup, peut-être. Mais les machines et les informaticiens qui les conçoivent, si. Et même au delà, des particuliers qui ne sont ni des machines, ni des informaticiens utilisent continuellement "le binaire" sans le savoir. Par exemple, tous ceux qui utilisent la configuration Windows XP SP3 et Excel 2003. Je connais même des gens qui, eux, ne sont pas du métier et qui savent ça !​
ROGER2327

__________________
Un lien parmi une multitude quasi innombrable sur le sujet :
Représentation d'un nombre dans un ordinateur
 

Statistiques des forums

Discussions
312 380
Messages
2 087 821
Membres
103 665
dernier inscrit
gjoanou