Pb de précision en VBA

sergio_bzh

XLDnaute Nouveau
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
 

tototiti2008

XLDnaute Barbatruc
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
 

Lii

XLDnaute Impliqué
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
 

sergio_bzh

XLDnaute Nouveau
[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
 

Discussions similaires

Réponses
3
Affichages
688

Statistiques des forums

Discussions
313 320
Messages
2 097 137
Membres
106 848
dernier inscrit
toufk