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 :

Arrondi à 0.5 sup [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Points : 51
    Points
    51
    Par défaut Arrondi à 0.5 sup
    Bonjour à toutes et à tous,

    Voilà mon problème, je souhaite arrondir un nombre à 0.5, c'est à dire, que si j'ai 3.2 ou 3.25 , j'obtiens 3.5 et si j'ai 3.7 ou 3.75, j'obtiens 4.0.


    J'ai essaié avec la fonction round(), mais le problème est le nombre ayant une décimal inférieur à 0.5, se voit passer à l'entier inférieur... : 3.25 avec on obtient 3

    Et en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nombre = round (3.25,1)
    on obtient 3.3 ...



    J'ai trouvé une solution, mais je la trouve extrèmement lourde.

    Je me sers d'un motif de RegEx pour valider une boucle. Voici mon code test qui m'a permis de valider le motif et de répondre à ce que je souhaite.



    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
    18
    19
    20
    21
    22
    23
    24
    Imports System.Text.RegularExpressions
     
    Public Class Form1
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim reg As New Regex("^[\d+]((\,?)(\.?))((\0?)(5?))$")
            Dim Text As Single
            Dim Valeur As Single = CSng(0.05)
     
            text = CSng(TextBox1.Text)
     
     
            If reg.IsMatch(Text) = False Then
                Do
                    Text = Text + Valeur
     
                Loop Until reg.IsMatch(Text) = True
            End If
     
            MsgBox(Text)
     
        End Sub
    End Class
    Nous avons des nombres ayant pour valeur max après la décimal 0.05, donc 3.05, 4.45, ..., donc j'augment le nombre de 0.05 et je compare au motif jusqu'à avoir une réponse True. Ici quand je rentre 3.25, je trouve comme résultat final 3.5 et pour 3.75, j'obtiens 4

    Je trouve ça peut évident à mettre en place dans mon programme plus complexe, et me demande s'il y a une meilleure solution pour ce type d'arrondi .

    Cordialement,
    Bacube

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    si tu veux j'ai trouvé une solution mais en c#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    decimal f = 3.52m;
                decimal p = Math.Truncate(f);
                if (f - p > 0.5m)
                {
                    f = p+1;
                }
                else if (f - p > 0)
                {
                    f = p + 0.5m;
                }

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il y a des tas de méthodes pour faire ca, c'est juste des maths


    google vient de me trouver celle là :
    X = Int(2 * X + 0.5) / 2

    et sinon un convertisseur c# vb.net :
    http://www.developerfusion.com/tools.../csharp-to-vb/
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    C'est ptet plus simple comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Function ArrondiBizarre(figure As [Single]) As [Single]
    	Return Convert.ToSingle(Math.Round(figure * 2) / 2)
    End Function

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    je ne vois pas plus simple que la proposition de code de Pol63.
    Il fait un arrondi à 0.5 au plus proche.
    Par contre il semble que tu veuilles un arrondi à 0.5 par excès :
    je souhaite arrondir un nombre à 0.5, c'est à dire, que si j'ai 3.2 ou 3.25 , j'obtiens 3.5 et si j'ai 3.7 ou 3.75, j'obtiens 4.0.
    Il suffit d'y apporter une petite modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim nombre As Single = 3.21
            nombre = CSng(Int(2 * nombre + 0.99) / 2)
            MessageBox.Show(CStr(nombre))
    En mettant autant de 9 que de décimales des nombres (à tester) en ayant le plus.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par chrismonoye Voir le message
    Bonsoir,
    je ne vois pas plus simple que la proposition de code de Pol63.
    C'était plus simple que l'histoire des Regex, sauf que le temps que je rédige...

    Cela dit, l'utilisation de Int c'est pas génial!

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    C'était plus simple que l'histoire des Regex, sauf que le temps que je rédige...
    Cela dit, l'utilisation de Int c'est pas génial!
    Ok reçu 2/2.
    Oui, Math.Truncate est peut être mieux que ce int.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Merci a tous !

    J'ai convertit le C# en VB.NET et en le retravaillant pour mon programme test, je trouve une solution nettement moins lourde.

    Voilà le code de mon test au cas où d'autres cherche un arrondi par excès au 0.5 près.

    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
    18
    19
    20
     Imports System.Math
     
    Public Class Form1
     
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim f As Decimal = CSng(TextBox1.Text)
            Dim p As Decimal = Math.Truncate(f)
     
            If f - p > 0.5D Then
                f = p + 1
            ElseIf f - p > 0 Then
                f = p + 0.5D
            End If
     
            MsgBox(f)
     
        End Sub
     
    End Class

    Encore merci, car je me suis aperçu que mon motif avait des erreurs, et donc pouvait poser des soucis. Je l'ai retravaillé hier soir, avec quelques tests.

    Voilà le code avec le nouveau motif, au cas où certains voudraient voir cette fonction.


    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
    18
    19
    20
    21
    22
    23
    Imports System.Text.RegularExpressions
     
    Public Class Form1
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim reg As New Regex("^(\d+)+((\,?)(\.?))+((\0?)(5?))$")
            Dim Text As Single
            Dim Valeur As Single = CSng(0.05)
     
            text = CSng(TextBox1.Text)
     
     
            If reg.IsMatch(text) = False Then
                Do
                    Text = Text + Valeur
     
                Loop Until reg.IsMatch(text) = True
            End If
     
            MsgBox(Text)
     
        End Sub
    End Class

    Cordialement,
    Bacube

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    de rien tu pouvais utilisé des noms plus éloquant que p et f

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Oui, dans mon programme réel les noms sont plus explicites, et correspondent mieux au noms réels.

    Là c'est juste un programme qui m'a permis de tester le code, donc j'ai rien renommé comme tu as pu le voir .


    Cordialement,
    Bacube

  11. #11
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Je reviens à la charge car je trouve que ma méthode elle est plus mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Function ArrondiBizarre(figure As [Single]) As [Single]
    	Return Convert.ToSingle(Math.Ceiling(figure * 2) / 2)
    End Function
    Et cette fois, l'arrondi est au supérieur:
    3.1=>3.5
    3.5=>3.5
    3.7=>4

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Merci, Tu as bien fait d'insister car elle marche et est encore moins lourde, puis mis en fonction elle est utilisable partout.

    Voilà lmon code test en utilisant la méthode de Nathanael

    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
    18
    Imports System.Math
     
    Public Class Form1
        Dim texte As Single
     
        Private Function ArrondiBizarre(ByVal figure As [Single]) As [Single]
            Return Convert.ToSingle(Math.Ceiling(figure * 2) / 2)
        End Function
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            texte = CSng(TextBox1.Text)
            texte = ArrondiBizarre(texte)
            MsgBox(texte)
     
        End Sub
     
    End Class

    Par contre là je pense devoir utiliser la première méthode pour un tout autre problème, je vais de voir convertir un angle en degrès en degrès minute seconde

    Donc 20.252° fera 20°15'7"

    Le soucis est que je dois récupérer l'entier et les décimales pour pouvoir faire ça. Je vais créer un nouveau poste pour ça, si je ne trouve pas de solution.



    Cordialement,
    Bacube

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

Discussions similaires

  1. Arrondi sup et troncature
    Par Kittystyle dans le forum Débuter
    Réponses: 2
    Dernier message: 01/07/2015, 11h24
  2. [XL-2010] arrondi sup et arrondi inf
    Par Byven dans le forum Excel
    Réponses: 3
    Dernier message: 06/11/2014, 18h21
  3. ecrire fonction arrondi sup sous VBA
    Par boom47 dans le forum Excel
    Réponses: 1
    Dernier message: 25/01/2012, 16h35
  4. fonction si et arrondi.sup dans access
    Par jean-baptiste dans le forum Access
    Réponses: 1
    Dernier message: 20/10/2005, 19h39
  5. [VB6] Racine carrée + arrondi
    Par Krys29 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/10/2002, 13h19

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