Arrondir à 3 chiffres

Résolu
pierrotm777 Messages postés 24 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 27 mai 2013 - 3 janv. 2012 à 13:02
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur 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

28 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 janv. 2012 à 09:59
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
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 janv. 2012 à 13:06
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 janv. 2012 à 13:23
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
0
DevLama Messages postés 356 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 18 novembre 2021 10
3 janv. 2012 à 13:25
Utilise int(ValeurArrondie)
0

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

Posez votre question
pierrotm777 Messages postés 24 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 27 mai 2013
3 janv. 2012 à 13:56
Oui c'est bien en vb.net 2010 express .

Merci de votre aide
0
NHenry Messages postés 15111 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 avril 2024 159
3 janv. 2012 à 14:52
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 janv. 2012 à 15:31
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
0
pierrotm777 Messages postés 24 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 27 mai 2013
3 janv. 2012 à 16:24
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 janv. 2012 à 08:07
qu'as tu entré ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
pierrotm777 Messages postés 24 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 27 mai 2013
4 janv. 2012 à 08:32
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
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
17 janv. 2012 à 10:19
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
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
17 janv. 2012 à 11:10
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)
0
pierrotm777 Messages postés 24 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 27 mai 2013
17 janv. 2012 à 17:02
Merci beaucoup de vore intérêt pour mon problème.
Je vais essayer tout cela dès que possible
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
18 janv. 2012 à 07:15
Seul inconvénient... sans le "e" à seul.
C'est pénible cette impossibilité d'éditer ses propres messages afin d'en corriger les coquilles.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 janv. 2012 à 07:25
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 janv. 2012 à 07:28
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
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
18 janv. 2012 à 07:34
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"
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 janv. 2012 à 07:39
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
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
18 janv. 2012 à 07:54
Je ne prétends rien. J'ai juste regardé comment s'effectuait le calcul :

Info1

Info2

Convertisseur
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 janv. 2012 à 08:20
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
0
Rejoignez-nous