Arrondir à 3 chiffres [Résolu]

pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 3 janv. 2012 à 13:02 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 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

28 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 janv. 2012 à 09:59
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 3 janv. 2012 à 13:06
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
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 3 janv. 2012 à 13:23
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
DevLama 353 Messages postés mercredi 13 avril 2011Date d'inscription 10 janvier 2018 Dernière intervention - 3 janv. 2012 à 13:25
0
Merci
Utilise int(ValeurArrondie)
Commenter la réponse de DevLama
pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 3 janv. 2012 à 13:56
0
Merci
Oui c'est bien en vb.net 2010 express .

Merci de votre aide
Commenter la réponse de pierrotm777
NHenry 14278 Messages postés vendredi 14 mars 2003Date d'inscription 21 octobre 2018 Dernière intervention - 3 janv. 2012 à 14:52
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
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 3 janv. 2012 à 15:31
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
pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 3 janv. 2012 à 16:24
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
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 4 janv. 2012 à 08:07
0
Merci
qu'as tu entré ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 4 janv. 2012 à 08:32
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
mdevaux62 111 Messages postés dimanche 24 décembre 2000Date d'inscription 17 novembre 2012 Dernière intervention - 17 janv. 2012 à 10:19
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
mdevaux62 111 Messages postés dimanche 24 décembre 2000Date d'inscription 17 novembre 2012 Dernière intervention - 17 janv. 2012 à 11:10
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
pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 17 janv. 2012 à 17:02
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
mdevaux62 111 Messages postés dimanche 24 décembre 2000Date d'inscription 17 novembre 2012 Dernière intervention - 18 janv. 2012 à 07:15
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 janv. 2012 à 07:25
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 janv. 2012 à 07:28
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
mdevaux62 111 Messages postés dimanche 24 décembre 2000Date d'inscription 17 novembre 2012 Dernière intervention - 18 janv. 2012 à 07:34
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 janv. 2012 à 07:39
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
mdevaux62 111 Messages postés dimanche 24 décembre 2000Date d'inscription 17 novembre 2012 Dernière intervention - 18 janv. 2012 à 07:54
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 janv. 2012 à 08:20
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.