Arrondir à 3 chiffres [Résolu]

Messages postés
24
Date d'inscription
vendredi 10 octobre 2008
Dernière intervention
27 mai 2013
- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 19 janv. 2012 à 09:35
Bonjour,
Ceci est mon premier post bien que j'utilise énormément les exemples du forum.
Je souhaite arrondir un résultat à trois chiffres mais je me retrouve avec un arrondi complet .
Voici mon code
Public Function dmstodec(ByVal coor As Double)
dmstodec = ""
Dim degres As Double
Dim minutes As Double
Dim minutes2 As Double
Dim secondes As Double
'46.1744444 - 0.1744444 = 46 ;
degres = coor - (coor - Int(coor))
'0.174444 * 60 = 10.46664 ;
minutes = (coor - Int(coor)) * 60
'10.46664 - 0.46664 = 10 ;
minutes2 = minutes - (minutes - Int(minutes))
'0.46664 * 60 = 27.984.
'secondes = Math.Round(CDbl((minutes - Int(minutes)) * 60), 3)
secondes = (minutes - Int(minutes)) * 60
'The result must to be : 46° 10' 27.984".
MsgBox("46.1744444" & vbCrLf & secondes & vbCrLf & degres & "° " & minutes2 & "' " & Math.Round(CDbl(secondes), 3), vbOKOnly, "dms to dec")

End Function

Quelle est mon erreur svp ?

Merci par avance de votre aide
Afficher la suite 

Votre réponse

20/28 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
3
Merci
Voilà ===>>>

O
ption Explicit
Private Sub Command1_Click()
  Dim exprdecimale As Double, expr As Double, secondes As Double, minutes As Double, degres As Double, decimales As Double
  exprdecimale = 46.1744444
  expr = exprdecimale * 60 * 60
  decimales = expr - Int(expr)
  secondes = Int(expr)
  calculons secondes, minutes, 60 ' car on a 60 secondes dans une minute
  calculons minutes, degres, 60 ' car on a 60 minutes dans un degré
  
  secondes = secondes + decimales
  MsgBox degres & "  degré(s)  " & minutes & "  minute(s)  " & secondes & "  seconde(s)"
End Sub
Private Sub calculons(uniteencours As Double, uniteaudessus As Double, rapport As Integer)
  uniteaudessus = uniteencours \ rapport
  uniteencours = uniteencours Mod rapport
End Sub


Et un tel code pourrait être utilisé pour n'importe quoi, à l'infini (par exemple pour calculer le nombre de sacs, de sachets et de goussets nécessaires pour caser x articles, sachant qu'un sac peut contenir xx sachets et qu'un sachet peut contenir yy goussets




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

Merci ucfoutu 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,

Question : Est-ce bien sous VB.Net, que tu développes ?
(u es ici dans la section VB.Net, mais ton code n'y ressemble pas ...)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
Dangereuses approximations :

'0.46664 * 60 = 27.984.

donne 27,9998399999954 si on garde la précision de 'minutes2'

code nettoyé un brin :

Private Sub Form_Load()
    MsgBox dmstodec(46.1744444), vbOKOnly, "The result must to be : 46° 10' 27.984"""
End Sub

Public Function dmstodec(ByVal coor As Double)
Dim degres As Long
Dim minutes As Long
Dim secondes As Double
    degres = coor
    coor = (coor - degres) * 60
    minutes = coor
    secondes = (coor - minutes) * 60
    dmstodec = degres & "° " & minutes & "' " & FormatNumber(secondes, 3) & """"
End Function



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
354
Date d'inscription
mercredi 13 avril 2011
Dernière intervention
22 novembre 2018
0
Merci
Utilise int(ValeurArrondie)
Commenter la réponse de DevLama
Messages postés
24
Date d'inscription
vendredi 10 octobre 2008
Dernière intervention
27 mai 2013
0
Merci
Oui c'est bien en vb.net 2010 express .

Merci de votre aide
Commenter la réponse de pierrotm777
Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
11 décembre 2018
0
Merci
Bonjour,

Actives Option Strict et Option Explicit, retires l'import automatique de l'espace de nom Microsoft.VisualBasic (propriétés du projet).
Et corriges les erreurs au besoin demande de l'aide.

Quand tu postes un code, regardes le point 2 de ma signature.

Concernant le problème, j'attends un complément de ta part si ce n'est pas résolu, si c'est résolu, regardes le point 3 de ma signature.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
Code inchangé, ou presque en .NET :

    Sub Form1_Load(ByVal sender As System.Object, ByVal e As EventArgs) Handles MyBase.Load
        MessageBox.Show(dmstodec(46.1744444), "The result must to be : 46° 10' 27.984""")
    End Sub

    Public Function dmstodec(ByVal coor As Double)
        Dim degres As Long
        Dim minutes As Long
        Dim secondes As Double
        degres = coor
        coor = (coor - degres) * 60
        minutes = coor
        secondes = (coor - minutes) * 60
        dmstodec = degres.ToString & "° " & _
                   minutes & "' " & _
                   secondes.ToString("0.000") & """"
    End Function


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
24
Date d'inscription
vendredi 10 octobre 2008
Dernière intervention
27 mai 2013
0
Merci
Interessant l'option de formattage secondes.ToString("0.000") .
Il y a une erreur dans ce code car je me retrouve avec des minutes et des secondes negatives
Commenter la réponse de pierrotm777
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
qu'as tu entré ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
24
Date d'inscription
vendredi 10 octobre 2008
Dernière intervention
27 mai 2013
0
Merci
J'ai utilisé ces lignes:
    Public Function dmstodec2(ByVal coor As Double)
        Dim degres As Long
        Dim minutes As Long
        Dim secondes As Double
        degres = coor
        coor = (coor - degres) * 60
        minutes = coor
        secondes = (coor - minutes) * 60
        dmstodec2 = degres.ToString & "° " & _
                   minutes & "' " & _
                   secondes.ToString("0.000") & """"
        MyDmsToDec = dmstodec2
        Return MyDmsToDec
    End Function

Puis j'utilise MyDmsToDec dans le reste du code
Commenter la réponse de pierrotm777
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Dernière intervention
17 novembre 2012
0
Merci
Bon j'ai essayé de comprendre et corriger le code initial.
J'ai regardé également quelques sources sur Internet (en passant, celle à laquelle tu te réfères comporte une erreur de calcul).
Ca donne ça :

    Public Function dectodms(ByVal coor As Double) As String
        Dim degres As Long
        Dim minutes As Long
        Dim secondes As Double
        Dim reste As Double
        Dim retour As String
        degres = Math.Truncate(coor)
        reste = (coor - degres) * 60
        minutes = Math.Truncate(reste)
        reste = (reste - minutes) * 60
        secondes = Double.Parse(reste.ToString("0.000"))
        retour String.Format("DEC to DMS : {0} {1}° {2}' {3}""", coor, degres, minutes, secondes)
        MessageBox.Show(retour)
        Return retour
    End Function
Commenter la réponse de mdevaux62
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Dernière intervention
17 novembre 2012
0
Merci
Encore plus simple (en 2 lignes !)... en utilisant un TimeSpan.
Seule inconvénient, les secondes sont arrondies à la partie entière :

Dim duree As TimeSpan = New TimeSpan(coor * 3600 * 10 ^ 7)
Dim retour as String String.Format("DEC to DMS : {0} {1}° {2}' {3}""", coor, duree.TotalHours, duree.Minutes, duree.Seconds)
Commenter la réponse de mdevaux62
Messages postés
24
Date d'inscription
vendredi 10 octobre 2008
Dernière intervention
27 mai 2013
0
Merci
Merci beaucoup de vore intérêt pour mon problème.
Je vais essayer tout cela dès que possible
Commenter la réponse de pierrotm777
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Dernière intervention
17 novembre 2012
0
Merci
Seul inconvénient... sans le "e" à seul.
C'est pénible cette impossibilité d'éditer ses propres messages afin d'en corriger les coquilles.
Commenter la réponse de mdevaux62
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,

On a au départ un nombre NB1 décimal, parfaitement traduisible en nombre NB2 (éventuellement décimal lui aussi) de secondes.
soit DEC la partie décimale de NB2 : elle restera toujours la même, avant ou après traitement de NB1 ==>> donc === >>
on ne doit traiter que la partie entière de NB1 ===>> en degrés, minutes et secondes. Il suffit alors de compléter/préciser les seules secondes en y ajoutant la partie décimale de NB1, arrondie comme on l'entend.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
pardon (gros doigts) ===>> correction ===>>
en y ajoutant la partie décimale de NB2
, arrondie comme on l'entend.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Dernière intervention
17 novembre 2012
0
Merci
Euh... pas vraiment.
Je dirais plutôt que le traitement est à faire sur la partie décimale de NB1 et que c'est la partie entière de ce nombre qui représente le nombre de degrés.

Ainsi par exemple (et si j'ai bien compris) 71,4567 donne 74° 27' 24,120"
Commenter la réponse de mdevaux62
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Que nous racontes-tu là, mdevaux62 ?
soit n le nombre de degrés exprimé en décimales ===>>
il représente un nombre de secondes = n * 60 * 60 qui sera lui aussi décimal
c'est de sa partie entière que l'on fait le calcul des degrés, minutes et secondes
c'est sa partie décimale que l'on arrondit ensuite comme on l'entend pour arriver au genre :
x degrés, y minutes, z.### secondes

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Dernière intervention
17 novembre 2012
0
Merci
Je ne prétends rien. J'ai juste regardé comment s'effectuait le calcul :

Info1

Info2

Convertisseur
Commenter la réponse de mdevaux62
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
je te signale simplement que la méthode de calcul que j'ai préconisé arrive exactement au même résultat que celui de ton lien "info2"

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.