IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Function pour arrondir


Sujet :

VB.NET

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut Function pour arrondir
    Bonjour à vous

    je compose un code pour arrondir en Floor et en Ceiling et je butte sur une partie importante de la function.

    Pour expliquer les caractéristiques recherchées de la function, j'aimerais par exemple arrondir au 10em ou au 100em en fonction de la profondeur.

    Donc

    Supposons 295
    prof=1 au 100em
    prof= 2 au 10em

    supposons 2150
    prof=1 au 1000em
    prof= 2 au 100em
    prof=3 au 10em

    etc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    'IntLength est la longueur du nombre à arrondir ex. 255
    ElseIf IntLength = 3 Then
     
                        Strtmp = Strtmp.Insert(Prof, ",")
     
                        If Prof = 1 Then
                            Coef = 100
    'Donc ici 255 retourne 300
                        ElseIf Prof = 2 Then
                            Coef = 10
    'Donc ici 255 retourne 260
     
                        End If
     
    IntTmp = Math.Ceiling(CDbl(Strtmp))
                        IntTmp = IntTmp * Coef


    je travail à améliorer la function pour qu'elle reconnaisse dans quel fraction arrondir en fonction de la profondeur choisi

    quelqu'un a une idée ?
    merci

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    the_rounded_decimal_Number = Math.Round(the_unrounded_decimal_number,the_number_of_decimal_digits, MidpointRounding.AwayFromZero)
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut
    Merci Graffito

    j'avais déjà exploré la fonction et c'est pas ce que je recherche mais peut-être que je l'ai pas bien compris.

    je cherche à récupérer le ceiling et non le round donc 12.3 vas égaler 13 et non 12

    en fin de conte ma dificulter est de reconnaitre sous quel coef multiplier en fonction de la profondeur

    si la prof est 1 donc mon 255 deviens 2.55, le ceiling deviens 3 et je doit multiplier par 100 pour revenir à 300

    ce qui veux dire l'arrondie de 255 = 300

    mais si j'ai une prof de 2, 255 deviens 25.5 ce qui donne un ceiling de 26 donc je dois le multiplier par 10 pour obtenir 260

    ce qui veux dire l'arrondie de 255 = 260

    voila ce que je recherche à automatisé

    merci pour ton implication

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Je peux te proposer deux variantes, l'une "purement" mathématique, l'autre basée sur la représentation textuelle du nombre.
    Je ne prétends pas qu'elles soient malines ou parfaites, mais elles semblent donner les bons résultats :

    Tout d'abord la seconde (oui c'est logique ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function RoundToNearest(number As Integer, depth As Integer) As Integer
        Static digits As String = "0123456789"
     
        Dim str = number.ToString
     
        Dim result = str.Substring(0, depth - 1)
        If str(depth - 1) = "9"c Then
            If result = "" Then result = "1"
            result &= 0
        Else
            result &= digits(digits.IndexOf(str(depth - 1)) + 1)
        End If
        Return Integer.Parse(result & New String("0"c, str.Length - depth))
    End Function
    Elle fonctionne en convertissant le nombre en chaine, puis on garde la partie avant la profondeur souhaitée, de là on vérifie le digit au niveau de la profondeur ; si c'est 9 et que notre résultat est vide (donc le 9 est en premier chiffre) on conserve un 10 sinon on rajoute juste un 0 au résultat et si ce n'est pas un 9, on prend le chiffre suivant dans l'ordre numérique qu'on rajoute. de là il ne reste plus qu'à combler le reste de la longueur du nombre avec des 0 et re-convertir ça en nombre.
    Si j'applique ça aux exemples données on a :
    RoundToNearest (255, 1) :
    str = "255"
    result = ""
    str(depth - 1) n'est pas un 9 on passe dans le Else
    on rajoute le digit de la "liste" suivant le digit observé (2 dans ce cas) donc
    result = "3"
    enfin on le comble avec des 0
    valeur retournée : 300

    RoundToNearest (255, 2)
    str = "255"
    result = "2"
    str(depth - 1) n'est pas un 9 on passe dans le Else
    on rajoute le digit de la "liste" suivant le digit observé (le premier 5 dans ce cas) donc
    result = "26"
    enfin on comble avec des 0
    valeur retournée : 260
    L'autre possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function RoundToNearest(number As Integer, depth As Integer) As Integer
        Dim length = CInt(Math.Floor(Math.Log10(number))) + 1
        Dim power = CInt(10 ^ (length - depth))
     
        Return ((number \ power) + 1) * power
    End Function
    On commence par calculer la longueur du nombre en appliquant "bêtement" la formule (il faut juste rajouter un Cast en entier car Math.Floor renvoie un Double) ; ensuite on détermine la puissance de 10 associée à la profondeur recherchée, et enfin on divise (division entière) le nombre par cette valeur on ajoute 1 et on re-multiplie.
    Si j'applique ça aux exemples données on a :
    RoundToNearest (255, 1)
    length = 3 (par application directe de la formule)
    power = 10 ^ (3 - 1) = 100
    si on décompose le calcul on a :
    tmp = number \ power -> 255 \ 100 = 2 (division entière)
    tmp = tmp + 1 -> 2 + 1 = 3
    tmp = tmp * power -> 3 * 100 = 300

    RoundToNearest (255, 1)
    length = 3 (comme précédemment)
    power = 10 ^ (3 - 2) = 10
    on décompose le calcul :
    tmp = number \ power -> 255 \ 10 = 25 (division entière)
    tmp = tmp + 1 -> 25 + 1 = 26
    tmp = tmp * power -> 26 * 10 = 260
    Après j'ai fait aucun tests poussés, genre si la profondeur est supérieure à la longueur du nombre ou si ça doit aussi gérer des flottants.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut
    Merci Sehnsucht

    la deuxième exemple, donc la première slon ta logique lol
    me semble pertinent surtout cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim power = CInt(10 ^ (length - depth))
    je test ça et je confirme

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je ne suis pas organisé pour tester ou comparer maintenant, mais la classe Math() du Framework a deux méthodes Floor, deux méthodes Ceiling et quelques méthodes Round.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut
    merci M. Clément j'utilise déjà les deux fonctions dans mon code.

    Mon cher Sehnsucht tu es mon idole du jour je te remercie infiniment

    le code semble fonctionner à merveille selon mes premier tests

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR XI] - probleme pour arrondir une valeur
    Par campia dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 11/03/2008, 13h32
  2. fonction pour arrondir
    Par Nibor dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2006, 16h48
  3. Réponses: 10
    Dernier message: 13/02/2006, 15h29
  4. [VB.NET] Fonction pour arrondir uin nombre...
    Par Aspic dans le forum VB.NET
    Réponses: 3
    Dernier message: 27/12/2005, 00h13
  5. Pb pour arrondir une variable Single
    Par Celia1303 dans le forum Access
    Réponses: 2
    Dernier message: 13/10/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo