Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Je m'amusais à savoir combien pouvait-il y avoir de chiffres entre 2 chiffres.
Je m'explique :
Par exemple, entre 1 et 2 :
- avec des ENTIERS il n'y a que 2 chiffres
- avec des DÉCIMAUX, mais avec 1 seul chiffre après la virgule, il y a 11 chiffres
- avec des DÉCIMAUX, mais avec 2 chiffres après la virgule, il y a 101 chiffres
- avec des DÉCIMAUX, mais avec 3 chiffres après la virgule, il y a 1.001 chiffres
- avec des DÉCIMAUX, mais avec 4 chiffres après la virgule, il y a 10.001 chiffres
- avec des DÉCIMAUX, mais avec 5 chiffres après la virgule, il y a 100.001 chiffres

En étudiant cette progression, j'ai bidouillé la fonction suivante :
VB:
Function NbChiffres(LimInf As Long, LimSup As Long, dec As Byte) As Double

 Dim i As Byte, x As Double
 
 If dec = 0 Then
   x = 0
 Else
   For i = 0 To dec
     x = x + 10 ^ (i - 1)
   Next
 End If
 
 NbChiffres = (LimSup - LimInf) * (1 + 9 * x) + 1
End Function
Contre toute attente, j'obtiens le nombre de chiffres + 1.
Je modifie la fonction :
VB:
Function NbChiffres2(LimInf As Long, LimSup As Long, dec As Byte) As Long
'Magic_Doctor

 Dim i As Byte, x As Long
 
 If dec = 0 Then
   x = 0
 Else
   For i = 0 To dec
     x = x + 10 ^ (i - 1)
   Next
 End If
 
 NbChiffres2 = (LimSup - LimInf) * (1 + 9 * x) + 1
End Function
Et là ça me donne le bon nombre de chiffres, mais au-delà d'un certain nombre (2 milliards... il faut dire qu'on monte vite en chiffres !) ça ne marche plus.

Pourquoi cette discordance entre "Long" et "Double" ? Mais, surtout, pourquoi avec "Double" on se plante dès le départ ?
 

Pièces jointes

  • Long vs Double.xlsm
    222 KB · Affichages: 29
Dernière édition:

job75

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonjour Magic_Doctor, le forum,

Il ne faut pas déclarer la fonction As Long mais la déclarer As Double ou ne pas la déclarer.

dec étant le nombre de décimales le nombre de chiffres entre 1 et 2 est bien sûr 10^dec + 1

Donc tu peux écrire ta fonction :

Code:
Function NbChiffres1(LimInf As Long, LimSup As Long, dec As Byte) As Double
NbChiffres1 = (LimSup - LimInf) * 10 ^ dec + 1
End Function
Maintenant si tu tiens à faire une boucle :

Code:
Function NbChiffres2(LimInf As Long, LimSup As Long, dec As Byte) As Double
Dim i As Byte, x As Double
 For i = 1 To dec
  x = x + 10 ^ (i - 1)
Next
NbChiffres2 = (LimSup - LimInf) * (1 + 9 * x) + 1
End Function
Dans les 2 cas le dernier 1 ne s'affiche pas au-delà de dec = 14 puisqu'Excel ne peut afficher que 15 chiffres significatifs.

Bonne journée.
 

job75

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Re,

Pour ta gouverne :

Code:
Sub Compare()
Dim dec As Byte, x As Double, y As Double
dec = 30 '15
x = 10 ^ dec
y = x + 1
MsgBox y > x
MsgBox y = x
End Sub
A+
 

Magic_Doctor

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonjour,

Merci job pour tes solutions.
Je ne tenais absolument pas à une boucle ; j'avais tenté de résoudre ce problème par ce moyen, mais le plus simple me paraît le mieux.
Je retiens donc :
NbChiffres1 = (LimSup - LimInf) * 10 ^ dec + 1

Quant aux décimales, dans mon quotidien, au-delà de 3 à 4, ça n'existe plus.
Ta fonction répond donc à tous les besoins non schizophréniques.

Bonne journée.

PS : c'est vrai que j'ai tendance à compliquer...
 

Magic_Doctor

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonjour,

Maintenant, je voudrais répertorier tous les chiffres entre 2 chiffres, en précisant qu’entre le 1er chiffre et le second il n’y a toujours qu’une unité (1 et 2, 305 et 306, 2.001 et 2.002…). Pour ce faire, j’ai "bidouillé " une boucle :
VB:
Sub DécompteIntervalle()
Dim i As Double, x As Double, y, LimInf As Long, LimSup As Long, dec As Byte
LimInf = 1
LimSup = 2
dec = 2 'marche bien pour dec = 1 et dec = 2, après ça cafouille
x = LimInf - 10 ^ -dec
y = NbChiffres(LimInf, LimSup, dec)
 For i = 1 To y
  x = x + 10 ^ -dec
  Debug.Print x 'pour voir ce que ça donne
Next
End Sub
Pour compter le nombre de chiffres, j’ai pris la fonction :
VB:
Function NbChiffres(LimInf As Long, LimSup As Long, dec As Byte) As Double
'Compte le nombre de chiffres entre 2 chiffres
'- LimInf : 1er chiffre
'- LimSup : 2ème chiffre
'- dec : nombre de décimales après la virgule
'job75
NbChiffres = (LimSup - LimInf) * 10 ^ dec + 1
End Function
Bien évidemment, on se limitera à 4, voir 5 décimales. Faut rester calme !

Merci d'avance pour m'expliquer pourquoi ça ne marche plus à partir de 3 décimales.
 

job75

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonjour Magic_Doctor,

La fenêtre Exécution n'affiche que les 199 derniers Debug.Print :

Code:
Sub a()
Dim i&
For i = 1 To 200 '199
Debug.Print i
Next
End Sub
Bonne journée.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonsoir,

Je reviens sur ce fil afin de mieux comprendre comment Excel gère les grands nombres.

Je reprends la fonction :
VB:
Function NbChiffres(LimInf As Double, LimSup As Double, dec As Byte) As Double
'Compte le nombre de chiffres entre 2 chiffres
'- LimInf : 1er chiffre
'- LimSup : 2ème chiffre
'- dec : nombre de décimales après la virgule
'job75

  NbChiffres = (LimSup - LimInf) * 10 ^ dec + 1
End Function
Travaillons dans l'intervalle [1 , 10] et jonglons uniquement avec le nombre de décimales après la virgule ("dec").
Jusqu'à dec = 14 le compte est bon, mais au-delà il manque toujours une unité.
Pourquoi ? Et est-ce corrigible ?

Merci d'avance pour tout commentaire.

Bonne fin de soirée à tous.
 

job75

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonjour Magic_Doctor, le forum,

C'est pourtant simple à comprendre, j'ai déjà expliqué au post #3 mais voyez le fichier joint.

Excel limite les nombres entiers aux 15 premiers chiffres significatifs et remplace les suivants par des zéros.

Pour faire des calculs exact sur des grands nombres il faut travailler sur des valeurs textes :

https://www.excel-downloads.com/threads/resolu-longue-operation-dans-cellule-excel.20001517/

A+
 

Pièces jointes

  • Classeur(1).xlsx
    15.7 KB · Affichages: 46
  • Classeur(1).xlsx
    15.7 KB · Affichages: 41

Magic_Doctor

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonsoir job, le forum,

Maintenant j'ai bien compris qu'au-delà d'un certain nombre de chiffres on travaille avec du texte.

J'ai bien regardé la PJ adressée à MADA et tâché d'obtenir ce que je voulais en utilisant les fonctions du classeur.
J'ai rédigé une petite macro événementielle pour obtenir le résultat escompté. 2 plombes que j'essaie sans succès.

Un grand merci pour qui me tirera d'affaire.

bonne fin de soirée.

PS : pas vraiment saisi la différence entre les 2 fonctions "additives" : "Additionner" & "AddEnt"
 

Pièces jointes

  • Addition et multiplication des entiers relatifs de grande longueur.xlsm
    30.7 KB · Affichages: 23
  • Addition et multiplication des entiers relatifs de grande longueur.xlsm
    30.7 KB · Affichages: 34

job75

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonsoir Magic_Doctor,

2 plombes ? Pourtant mes fonctions sont faciles à appliquer :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Calcul de (LimSup - LimInf) * 10 ^ dec + 1
Dim LimInf$, LimSup$, dec As Byte, x$, y$, z$
LimInf = [B25]: LimSup = [B26]: dec = [B27]
x = Additionner(LimSup, "-" & LimInf)
y = 1
For dec = 1 To dec
  y = Multiplier(y, 10)
Next
z = Multiplier(x, y)
z = Additionner(z, 1)
[B29] = z
End Sub
Fichier joint.

Bonne nuit.
 

Pièces jointes

  • Addition et multiplication des entiers relatifs de grande longueur(1).xlsm
    32.8 KB · Affichages: 26

job75

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Re,

Fonction VBA :

Code:
Function NbChiffres$(LimInf$, LimSup$, dec As Byte)
'Calcul de(LimSup - LimInf) * 10 ^ dec + 1
Dim x$, y$, z$
x = Additionner(LimSup, "-" & LimInf)
y = 1
For dec = 1 To dec
  y = Multiplier(y, 10)
Next
z = Multiplier(x, y)
NbChiffres = Additionner(z, 1)
End Function
Fichier (2).

Rebonne nuit.
 

Pièces jointes

  • Addition et multiplication des entiers relatifs de grande longueur(2).xlsm
    29.7 KB · Affichages: 41

Magic_Doctor

XLDnaute Barbatruc
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"

Bonsoir job, le forum,

Quelle aventure ! Je dois reconnaître que ce problème est une leçon d'humilité : question quasi triviale, réponse quasi "hallucinante".
Demander à une bécane de réaliser cette simple opération : 1.000.000.000.000.000 + 1
Ô combien de prétentieux marioles répondront péremptoirement : "Mais... c'est évident !"
Tiens, mon œil !
Enfin j'obtiens le résultat qui ne sert strictement à rien dans la routine quotidienne, mais qui satisfait l'esprit un peu tatillon. Après tout, quand on fait les choses, autant bien les faire ! (cf. mon projet de listes de nombres aléatoires)
La combinaison de "NbTotalDeChiffres" & "SepareMilliers" marche très bien, sauf, curieusement, pour certaines "coordonnées".
Dans la PJ j'ai mis ces fonctions sous la forme la plus minimaliste qui soit.
Peut-être me suis-je (encore) planté quelque part... Mais si on prend comme intervalle [5 , 10] et que l'on "jongle" avec le nombre de décimales après la virgule, pourquoi ces discordances ?

En attendant, bravo job !
 

Pièces jointes

  • Chiffres longs.xlsx
    8.9 KB · Affichages: 29

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 920
Membres
101 840
dernier inscrit
SamynoT