Arrondir données

Résolu
ketchups Messages postés 24 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 21 décembre 2007 - 16 nov. 2007 à 08:34
ketchups Messages postés 24 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 21 décembre 2007 - 19 nov. 2007 à 07:36
Hello tous le monde,





J’aurai besoins d’un petit peu d’aide.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>







Je suis entrant de faire un programme qui fait des calcules et j’aimerai pouvoir arrondir mes données à une décimal. Et donc arrondi de cette manière :







23.565578775







23.5








 







Si quelqu’un aurait une idée ….

10 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
18 nov. 2007 à 11:19
Bonjour JMO,

Je ne suis pas convaincu par tes solutions... Je détaille le pourquoi.


En premier lieu, FormatNumber renvoi un type String, or si on arrondi un nombre, c'est parce qu'on fait du fait (en principe), donc dans une programmation structurée on déclare le type des variables. Et pour celles destinées aux calculs, on aura un truc du genre :


Dim V as double


OR, on ne pourra faire ensuite V=formatNumber([expression numérique STRING], .......) car il va y avoir une incompatibilité avec le typage... donc on va être obligé d'utiliser une conversion de type avec VAL ou autre CDBL... C'est donc mettre une couche supplémentaire, et tant qu'on peut éviter... ben, j'évite...

Ensuite ROUND... Normalement, cette fonction doit arrondir un nombre numérique, donc la remarque ci-dessus ne tient plus... Oui, c'est vrai. Mais, elle a un BUG !! En effet, l'arrondi de 1.25, à un chiffre donne 1.2... au lieu de 1.3.... par chance !

D'ailleurs, essaye ton code avec 1.25... et tu obtiendra deux résultats différents... dommage...

Ton code :

Sub ess()
monnombre = InputBox("Nombre à arronidr", "Chercher l'erreur", 1.25)
MsgBox "FormatNumber" & vbTab & Replace(FormatNumber(monnombre, 1), ",", ".") & vbCrLf & _
       "Round" & vbTab & Replace(Round(monnombre, 1), ",", ".")
End Sub

=

A la réflexion, je propose une version améliorée de ma fonction "arrondi" :

Function Arrondi(nb, ByVal Nb_Chiffre As Integer, OptionalByVal Sens = 0.5) As Double
'Arrondi Nb à Nb_Chiffre
'Option Sens : 0.5 => au + Près | 0 => Par Défaut | 1 => Par Excès
If Not IsNumeric(nb) Then nb = Val(Replace(nb, ",", "."))
Arrondi = Int(nb * 10 ^ Nb_Chiffre + Sens) / 10 ^ Nb_Chiffre
End Function

Ma fonction a donc les avantages suivants :
- Pas de problème d'arrondi !
- Traite une expression numérique en Variant,
- Possibilité d'arrondir par défaut ou par excès. (ou autre d'ailleurs en regardant "Sens")

Amicalement,
Us.
3
lolokun Messages postés 1241 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 27 août 2013 7
16 nov. 2007 à 08:49
Salut,

Utilises la fonction Round :
Math.Round(tavaleur,1)
0
ketchups Messages postés 24 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 21 décembre 2007
16 nov. 2007 à 12:41
j'ai essayé mais sa ne fonctionne pas...
j'ai oublié de précisier que je fais des calcule dans une feuille excel
donc ma valeur c'est une variable ...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
16 nov. 2007 à 13:00
"j'ai oublié de précisier que je fais des calcule dans une feuille excel"

Ah bon ?

Nous n'aurions pas cru (Thèmes /VB.NET et VB 2005 / Algorithme / Maths / arrondir données )

Alors ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ketchups Messages postés 24 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 21 décembre 2007
16 nov. 2007 à 14:14
pourrais-tu alors m'indiquer la section appropriée ou je pourrais poster mon message?
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 nov. 2007 à 15:13
Cherche pas midi à quatorze heure ! voici le code :

=

Function Arrondi(Nb, ByVal Nb_Chiffre As Integer) As Double
'Arrondi Nb à Nb_Chiffre
If Not IsNumeric(Nb) Then
    Arrondi = Int(Val(Replace(Nb, ",", ".")) * 10 ^ Nb_Chiffre + 0.5) / 10 ^ Nb_Chiffre
Else
    Arrondi = Int(Nb * 10 ^ Nb_Chiffre + 0.5) / 10 ^ Nb_Chiffre
End If
End Function

=

Pour l'utiliser dans le code de ta macro :

=

Sub ess()
MsgBox Arrondi(23.565578775, 1)
End Sub

=

qui renvoi 23,6 (et non 23,5 ! normal on arrondi au plus près)

Amicalement,
Us.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
17 nov. 2007 à 12:23
 Bonjour à tous,

Effectivement, Round ou FormatNumber arrondissent.

2 exemples qui renvoient 23.5

MonNombre = 23.56557877

MsgBox Replace(Left(MonNombre,Len(FormatNumber(MonNombre,1))),",",".")

TabNbre = Split(MonNombre,",")
MsgBox TabNbre(0) & "." & Left(TabNbre(1),1)

jean-marc
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
17 nov. 2007 à 22:17
ben... j'préfère encore ma solution... Quand j'arrondi je préfère que se soit au plus près... (on peut d'ailleurs facilement ma function pour faire un arrondi par défaut ou par excès...)... et pis utiliser des instructions qui utilise des chaines dans un calcul, je trouve que cela est un contre sens...

Amicalement,
Us.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
18 nov. 2007 à 08:32
 Bonjour à tous,

Bonjour us_30,
La fonction Round peut s'utiliser différemment:

MsgBox "FormatNumber" &vbTab&       Replace(FormatNumber(MonNombre,1),",",".") &vbCrLf& _
       "Round"        &vbTab&vbTab& Replace(Round(MonNombre,1),",",".")          

 jean-marc
0
ketchups Messages postés 24 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 21 décembre 2007
19 nov. 2007 à 07:36
Merci pour votre aide j'essaye tous ça entre aujourd'hui et demain

us_30> ton dernier code m'a l'air intéressant je penses, je n'aurai qu' à changé la valeur de Sens

Je vais essayé de toutes les tester et dire ce que j'en penses
0
Rejoignez-nous