Fonction d'arrondi qui marche?

Signaler
Messages postés
25
Date d'inscription
vendredi 29 août 2003
Statut
Membre
Dernière intervention
28 juillet 2005
-
Messages postés
1
Date d'inscription
jeudi 13 novembre 2003
Statut
Membre
Dernière intervention
25 juillet 2005
-
Bonjour
Les petit rigolos de chez Microsoft nous ont pondu une fonction round buggé. enfin, en tout cas en ce qui concerne ma version de VB.
en effet :
Round(0.135, 2) donne 0.14
mais:
Round(0.125, 2) donne 0.12
cherchez l'erreur (pour ce qui ne l'aurai pas vu, 0.125 aurai du etre arrondi au superieur, comme 0.135)
il se plantera aussi pour 0.145,0.165,0.185.

donc je suis a la recherche d'une fonction ou au moins d'indice qui me permettrai de faire une fonction qui:
-Marche dans tout les cas de figure
-permette d'arrondir au dessus de 0 (ex: a 1000 pres)
-permette aussi d'arrondir a 5 pres (ex: a 0.5 ou 50 pres)

Merci et bonne fin de journee

syl
A voir également:

5 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
je t'ai une fonction qui arrondi par default, si tu veux...

Private Sub Form_Load()
    MsgBox Round(0.125, 2), Title:="Round 0.125 ; 2"
    MsgBox ReyRound(0.125, 2), Title:="ReyRound 0.125 ; 2"
    MsgBox Round(0.135, 2), Title:="Round 0.135 ; 2"
    MsgBox ReyRound(0.135, 2), Title:="ReyRound 0.135 ; 2"
End Sub

Public Function ReyRound(Value As Double, Size As Integer) As Double
    Dim Factor As Long
    Factor = Val("1" & String(Size, "0"))
    ReyRound = Val(Value * Factor) / Factor
End Function


By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
la fonction de chez Crosoft n'est surement pas buggée, mais elle doit se baser sur des imprecisions mathematiques, de dedales, de virgules flottantes.....

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
Messages postés
25
Date d'inscription
vendredi 29 août 2003
Statut
Membre
Dernière intervention
28 juillet 2005

Perdu, mais bien tenté
en effet, les regles mathematiques exigent que qu'un nombre soit arrondi au supérieur des que le chiffre suivant est suppérieur ou egale a 5, a l'inferieur sinon.
ainsi, 0.125 DOIT etre arrondi a 0.13 . ta fonction me donne 0.12. et ne marche donc pas tres bien.

Pour en revenir a la fonction de Microsoft, d'apres moi, une fonction bugge une fonction qui ne renvoie pas toujours un resultat correct. La fonction round correspond a cette definition donc elle est buggee, ou alors je me trompe dans la definition.

@+
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
ma fonction fonctionne : elle arrondi par defaut !!

voila une version corrigée :

Public Function ReyRound(Value As Double, Size As Integer) As Double
    Dim Factor As Long
    Factor = Val("1" & String(Size, "0"))
   
    Dim Unit As Double
    Unit = Val("0." & String(Size - 1, "0") & "1")
    
    Dim Resultat As Double
    Resultat = (Val(Value * Factor) / Factor)
    
    If CDbl(Resultat & "5") <= Value Then
        ReyRound = Resultat + Unit
    Else
        ReyRound = Resultat
    End If
End Function

Private Sub Form_Load()
MsgBox Round(0.125, 2), Title:="Round 0.125 ; 2"
MsgBox ReyRound(0.125, 2), Title:="ReyRound 0.125 ; 2"
MsgBox Round(0.124, 2), Title:="Round 0.124 ; 2"
MsgBox ReyRound(0.124, 2), Title:="ReyRound 0.124 ; 2"
End
End Sub


By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
Messages postés
1
Date d'inscription
jeudi 13 novembre 2003
Statut
Membre
Dernière intervention
25 juillet 2005

bonjour à tous,

j'ai également rencontré le problème. En fait la fonction Round arrondit mal les chiffres pairs.

Exemple, Round(4.335,2) donnera bien 4.34 mais Round(4.325) donnera 4.32 au lieu de 4.33.



En clair, il vaut mieux utiliser une fonction écrite à la main :)