Pb de précision en VBA

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

sergio_bzh

XLDnaute Junior
Bonjour,

c'est un problème déjà évoqué il y a longtemps mais si quelqu'un avait une solution ce serait pas mal !
https://www.excel-downloads.com/threads/petite-enigme-de-precision.24363/

A partir de nombres avec 4 chiffres après la virgule, je me retrouve avecdes nombres avec 15 chiffres. Pourtant, je pars d'un Single (réél simple)
- je multiplie par 10000
- je prends la partie entière en le mettant dans un Long
- je divise par 10000
=> le nombre a bien 4 décimales
- j'ajoute 0.1
=> le nombre a 15 décimales.

Voilà le code pour mettre le pb en évidence :

Code:
Sub Macro1()
    Range("A1").Select
   Range("A1").NumberFormat = "0.00%"
    Range("B1").FormulaR1C1 = "31"
    Range("C1").FormulaR1C1 = "20"
    va = (Range("B1").FormulaR1C1 - Range("C1").FormulaR1C1) / Range("B1").FormulaR1C1
    vaNorm = NormalizeVal(va)
    Range("A1").Value = vaNorm
    vabiz = vaNorm + 0.1
End Sub
                ' Resultat des courses :
                '     "va"      vaut 0,354838709677419
                '     "vaNorm"  vaut 0,4548
                '     "vaBiz"   vaut 0,45479998588562


Private Function NormalizeVal(ByVal v As Single) As Single
    Dim lg As Long
    lg = CLng(10000 * v)
    NormalizeVal = CSng(lg / 10000)
End Function

Il y a une demi-solution qui consisterait à transformer en chaine de caractères avant de mettre dans la cellule mais ça ne me convient pas du tout.

Je suis en Excel 2000 sous XP. Si quelqu'un a une solution à ce problème ...

Merci.
Sergio
 
Re : Pb de précision en VBA

Bonjour Sergio_bzh,

oui, j'ai déjà observé ce problème de nombreuses fois en VBA avec les Single, c'est pour ça que je n'utilise plus que des Double :

Code:
Private Function NormalizeVal2(ByVal v As Double) As Double
    Dim lg As Long
    lg = CLng(10000 * v)
    NormalizeVal2 = CDbl(lg / 10000)
End Function
 
Re : Pb de précision en VBA

Bonjour Tous,

et ainsi ?
Code:
Sub Macro1()
    Range("A1").Select
   Range("A1").NumberFormat = "0.00%"
    Range("B1").FormulaR1C1 = "31"
    Range("C1").FormulaR1C1 = "20"
    va = [B]1 - Range("C1").FormulaR1C1 / Range("B1").FormulaR1C1[/B]
    vaNorm = NormalizeVal(va)
    Range("A1").Value = vaNorm
    vabiz = vaNorm + 0.1    
End Sub
                


Private Function NormalizeVal(ByVal v As Single) As Single
   [B] NormalizeVal = Int(v*10000) / 10000[/B]
End Function
 
[RESOLU] Re : Pb de précision en VBA

Effectivement avec tout en double, cela semble fonctionner. Ca va me faire quelques modifs un peu partout mais vaut mieux ça.

Lii,
ta solution me donne exactement le même résultat (ou plutôt le même pb !).

Merci a tous
Sergio
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
2 K
Réponses
0
Affichages
1 K
Réponses
12
Affichages
2 K
Retour