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

WinDev Discussion :

nombre réel exprimer avec x nombre significatif [WD17]


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut nombre réel exprimer avec x nombre significatif
    bonjour a tous,

    Existe il une fonction dans windev pour exprimer un résultat avec X nombre significatif s'il vous plait ?

    exemple pour 3 chiffres significatif
    123.12456 => 123
    12.36 => 12.4
    1.2345 => 1.23
    0.00124 => 0.001
    Je vous remercie par avance

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 162
    Points : 9 112
    Points
    9 112
    Par défaut
    Regarde du côté de arrondi() : ici...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre émérite
    Femme Profil pro
    .
    Inscrit en
    Janvier 2012
    Messages
    996
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : .
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 996
    Points : 2 514
    Points
    2 514
    Par défaut
    Stefano,

    Depuis 2007 (date de tes débuts avec windev) tu ne sais toujours pas lire l'aide ?
    Ne le prends pas mal, mais tu as bigrement de la chance de trouver ici un forum aussi permissif.
    Pour moi ça vaut -1 dans ton cas.
    Par contre tu ne mets pas tous les atouts de ton côté...
    C'est dingue cette mode à l'assistanat total.

    Cordialement.

  4. #4
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    En complément de Fenchsting, je vous indique que vous disposez du type numérique qui permet d'utiliser jusqu'à 38 positions significatives.
    Lire attentivement le paragraphe sur les syntaxes pour adapter à votre besoin.

    Attention à l'utilisation de ce type (et de manière général à TOUS les types) quand on les passe en paramètres... sous peine d'erreur de type "GPU Access violation" inhérentes au trans-typage implicite de WinDev qui permet la "facilité" du code comme affecter des numériques dans des chaines et réciproquement... tant que cela ne dépasse pas ! Pour preuve le paragraphe "Remarques, Affectation d'un numérique" (à lire obligatoirement avec un dictionnaire s'il le faut) de la même page qui indique que ...
    "cette valeur est automatiquement convertie en réel par le compilateur"
    ...
    sauf à utiliser une notation adaptée.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    Bonjour a tous,

    Merci pour vos réponses, mais la fonction Arrondi() et le typage en numérique ne convienne pas ou alors je sais pas les utiliser malgré l'aide en ligne.
    Je dois exprimé des résultats de calcul avec 3 chiffres significatif, sachant que la partie entière et la partie décimal ont des tailles variables.
    Si je fixe le nombre de décimal à une variable de type numérique ça ne fonctionne pas pour tous les cas
    par exemple

    NumDepart = 2.3694
    resultat est un numérique (10,3)
    cela me retourne 2.369 au lieu de 2.37

    Si je prends comme valeur de départ 0.0001, j'ai 0 en retour au lieu de 0.0001
    J'ai essayé de mettre la valeur pour le nombre de décimal dans la déclaration de la variable de type numérique une variable ( resultat est un numérique (10,nNbreDecimal) en calculant le nombre de chiffre de la partie décimal restant en faisant (3-laPartieEntière), Ca ne fonctionne pas car numérique n'accepte pas de variable dans sa déclaration. ça aurait été trop simple

    J'ai le même problème avec la fonction Arrondi() sur le fait que si je fixe le nombre de décimal j'aurai des résultats erronés
    Arrondi(2.3694,3) me retournera 2.37 mais si je prends Arrondi(0.0001,3) j'ai 0 de retourner.

    Avant de partir sur différents cas en vérifiant le nombre de chiffre présent dans la partie entière, le nombre de chiffre dans la partie décimal pour déterminer si j'affiche 0, 1, 2 ou 3 décimal , plus traiter les cas ou juste après la virgule j'ai des 0 qui peux vite tourner à un usine à gaz, je suis venu sur le forum pour demander conseil auprès de personnes maîtrisant mieux que moi (là y a pas de mal) windev.
    D'où mon post, mais mea culpa, je n'ai pas été assez précis dans l'exposé de ma problématique et je m'en excuse.

    Si vous avez des pistes pour m'aider elle seront bien venu

    Merci encore

  6. #6
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    re,
    Je ne retiens donc qu'une phrase : celle de votre besoin.
    Je dois exprimé des résultats de calcul avec 3 chiffres significatif
    Déjà il vous faut utiliser un type de variable qui permet cela...
    L'idéal serait qu'il garantisse surtout la précision de vos calculs (en étudiant les cas extrêmes des valeurs acceptées ainsi que les arrondis intermédiaires ou effet des valeurs tronquées si on transfert dans des types intermédiaires par exemple la division de deux entiers peut nécessiter un monétaire si on souhaite une précision jusque 6 décimales).

    Ensuite, on parle uniquement du résultat du calcul et de 3 chiffres significatifs.
    je vous invite donc a proposer un masque d'affichage (et/ou de saisie selon votre besoin) selon la valeur.
    -10< à <10 => masque "-9.99"
    -100< a <100 => masque "-99.9"
    -1000< a <1000 => masque "-999"
    autre cas => dépassement de capacité.

    Partons du principe que vous calculez avec un type monétaire (6 décimales significatives dans les calculs)
    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
    PROCEDURE GetFormat(mValeur est un monétaire, cFormat est une chaîne) : booléen
    mTemp est un monétaire = Abs(mValeur)
    cFormat = ""
    SI mTemp < 10 ALORS
    	cFormat = "-9,99"
    SINON SI mTemp < 100 ALORS
    	cFormat = "-99,9"
    SINON SI mTemp < 1000 ALORS
    	cFormat = "-999"
    FIN
    RENVOYER (cFormat <> "")
     
    //------- Utilisation
    NumDepart est un monétaire = 2.3694
    cMasque est une chaîne
    // Affecte le masque si on le trouve, ne touche a rien sinon...
    SI GetFormat(NumDepart,cMasque) ALORS  SAI_SansNom1..MasqueAffichage = cMasque
    // affecte la valeur au champ de saisie
    SAI_SansNom1 = NumDepart
    CQFD :
    2.3694 -> 2.37
    23.9781 -> 24.0
    239.781 -> 240

    On notera la possibilité pour un champ numérique (SAI_SansNom1) d'avoir un masque de saisie différent du masque d'affichage...
    Pour récupérer l'une ou l'auer des valeurs, utiliser SAI_SansNom1..Valeur (valeur saisie) ou SAI_SansNom1..ValeurAffiche (valeur selon le masque d'affichage).

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    RE bonjour ,

    J'y suis arrivé mais pas par votre méthode, bien que très intéressante mais je la garde sous le coude.

    Voila comment j'ai procédé
    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
     
    sLaPartieEntiere, sLaPartieDecimale sont des chaînes
    sLeNbreFormate est un réel
    i  est un entier
     
    sLaPartieEntiere = PartieEntière(unNombre)
    sLaPartieDecimale = PartieDécimale(unNombre)
    SI Taille(sLaPartieEntiere) >= 3 ALORS 
    	RENVOYER PartieEntière(unNombre)
    SINON
    	 nNBreMaxDecimalDefaut est un entier = 3
    	 nNbreDEcimalAJouter est un entier = 0
    	 i=3
    	 TANTQUE Milieu(sLaPartieDecimale,i,1)="0"
    	 	nNbreDEcimalAJouter++
    	 	i++
    	 FIN
    	 SI PartieEntière(unNombre)<>"0" ALORS
    	 	nNBreMaxDecimalDefaut = nNBreMaxDecimalDefaut- Taille(PartieEntière(unNombre))
    	 FIN
    	sLeNbreFormate = Arrondi(unNombre,nNBreMaxDecimalDefaut+nNbreDEcimalAJouter)
    FIN
     
    RENVOYER sLeNbreFormate
    Je sais pas si c'est très académique comme raisonnement mais sur plusieurs tests que j'ai effectué ça à l'air de fonctionner autant pour les nombres de type 0.0000123456 que pour les nombres 1.23568 et 0.0102587.

    Dans tous les cas merci R&B d'avoir pris le temps de m'aider

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    +1 Stefano!!!

    Tu viens de réecrire la fonction Arrondi() de WD...

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour

    Un peu rapide comme conclusion me semble-t-il.

    Tout d'abord, il me semble que le problème n'a pas encore été complètement énoncé.

    R&B avait relevé :
    Je ne retiens donc qu'une phrase : celle de votre besoin.
    Je dois exprimé des résultats de calcul avec 3 chiffres significatif
    Vous ne l'avez pas repris alors que vous avez aussi noté :
    Si je prends comme valeur de départ 0.0001, j'ai 0 en retour au lieu de 0.0001
    et que votre solution traite effectivement cette possibilité des 5 chiffres pour autant qu'il s'agisse de décimales.

    Donc, qu'en est-il exactement ?
    Parce que que 0.0001, cela fait 5 chiffres et qu'il est normal, dans l'hypothèse de 3 chiffres, que 0.0001 revienne à 0.00, voire à 0.


    D'autre part, votre énoncé et votre solution présentent encore des problèmes potentiels :
    - quid si le nombre vaut 123156, càd au-delà de 999 (dernier nombre à 3 chiffres sans décimale) ? Peut-être est-ce au-delà du spectre que vous devez traiter, mais vous n'en avez pas traité.
    - ligne 7 :"SI Taille(sLaPartieEntiere) >= 3 " revient à tronquer sans tenir compte d'un éventuel arrondi à faire à l'unité supérieure : 123,9 devrait devenir 124 et non 123

    Il y a donc encore du travail à faire pour énoncer le problème et pour le résoudre.

    Hemgé

  10. #10
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    j'avais évoqué le problème...
    autre cas => dépassement de capacité.
    Mais avais omis les 10-n avec n>3

  11. #11
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Citation Envoyé par R&B Voir le message
    j'avais évoqué le problème...:

    Tout à fait
    , mais stefano n'a pas complété votre énoncé de son besoin, apparemment plus complexe que les 3 chiffres significatifs.
    Et il vous aurait donc été difficile de répondre complètement à cette partie à peine évoquée de son besoin, quand bien même votre dépassement de capacité aurait couvert toutes les hypothèses.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    Bonjour a tous,

    Citation Envoyé par Hemgé Voir le message

    R&B avait relevé :

    Vous ne l'avez pas repris alors que vous avez aussi noté :
    et que votre solution traite effectivement cette possibilité des 5 chiffres pour autant qu'il s'agisse de décimales.

    Donc, qu'en est-il exactement ?
    Parce que que 0.0001, cela fait 5 chiffres et qu'il est normal, dans l'hypothèse de 3 chiffres, que 0.0001 revienne à 0.00, voire à 0.

    Hemgé
    Juste une précision concernant les chiffres significatifs.
    0.0001 cela ne fait qu'un seul chiffre significatif, bien qu'il y ai 5 chiffres les 0 précédant le 1 ne rentre pas en compte donc pour avoir 3 chiffres significatifs pour l'expression d'un résultat il faut trois chiffre à droite de la virgule différent de 0 et l'on compte à partir du premier caractère différent de 0
    par exemple
    123.256 donne 123
    12.3256 donne 12.3
    1.23256 donne 1.23
    0.123256 donne 0.123
    0.0000123568 donne 0.0000123
    0.00102200 donne 0.00102
    les chiffres au delà du 3 sont négligeables et ne représente rien (tout dépend bien sur des unités que l'on utilise et de la précision que l'on souhaite obtenir)
    De même pour ce qui est des 0 situé juste après la virgule, il ne sont pas à prendre ne considération lorsque l'on parle de chiffres significatifs
    le nombre de caractère numérique et les chiffres significatifs sont 2 notions distinct et j'ai l'impression dans vos commentaires qu'il y a confusion.

    Après lorsque l'on a plus de 3 caractères numérique dans la partie entière
    1232.56 donne 1.23x10^3
    12325.6 donne 1.23x10^4
    etc.
    Certes dans la solution que j'ai trouvé je n'ai pas pris en compte les puissances de 10 pour l'application sur laquelle je suis en train de travailler le cas ne se présentera pas ou au pire il y aura une conversion d'unité qui sera faite.

    Citation Envoyé par Hemgé Voir le message
    quid si le nombre vaut 123156, càd au-delà de 999 (dernier nombre à 3 chiffres sans décimale) ? Peut-être est-ce au-delà du spectre que vous devez traiter, mais vous n'en avez pas traité.
    ligne 7 :"SI Taille(sLaPartieEntiere) >= 3 " revient à tronquer sans tenir compte d'un éventuel arrondi à faire à l'unité supérieure : 123,9 devrait devenir 124 et non 123
    Et bien si j'ai 123156 puisque la taille de la partie entière est supérieure à 3 je renvoi 123156
    ligne 7 : là effectivement j'ai omis le traitement de l'arrondi, comme quoi un oeil externe ça aide merci


    Citation Envoyé par Hemgé Voir le message
    Tout à fait, mais stefano n'a pas complété votre énoncé de son besoin, apparemment plus complexe que les 3 chiffres significatifs.
    Et il vous aurait donc été difficile de répondre complètement à cette partie à peine évoquée de son besoin, quand bien même votre dépassement de capacité aurait couvert toutes les hypothèses.
    Disons que contrairement à ce que l'on pourrait croire, je ne cherche pas de solution pré mâché où l'on fait un copier/coller et puis vogue la galère. Lorsque je demande de l'aide sur le forum, c'est juste pour avoir des pistes de réflexions ou un début de solution et pas la solution complète (sauf si vraiment je suis coincé, mais dans ce cas j'essai d'être le plus explicite possible et je dit ce que j'ai fait ainsi que le résultat obtenu avec le code qui va bien avec).

  13. #13
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut " j'ai l'impression dans vos commentaires qu'il y a confusion." Ah bon !!!!! ?
    Bonsoir stefano,

    Votre dernier message appelle plusieurs commentaires

    Tout d'abord sur le plan général
    Ce site est un site d'entraide et chaque question constitue une entrée de la base de connaissance qui est ainsi développée et mise à disposition de tous à venir.
    De là découle notamment la demande de poster les solutions trouvées (et éprouvées) de manière à ce que d'autres n'aient même plus à poser la question ou puissent se servir des discussions comme un complément au guide d'autoformation.
    De là découle quelque part la charge pour le demandeur de formuler sa question de manière aussi claire et précise que possible, sans omettre de bien préciser l'environnement et les circonstances où il se trouve.

    Complémentairement, ceux qui répondent aux questions le fond à titre bénévole et prennent leur intervention à cœur, voire comme un défi (relatif).
    Ils apprécient de répondre à propos et avec propos, et méritent une implication au moins équivalente à la leur de la part de celui qui poste une question.
    C'est une question de respect mutuel.
    Cette implication se mesure notamment à la précision et à la documentation de la question évoquées plus haut, ainsi qu'au suivi qui est assuré par celui qui a initié la discussion.

    Ensuite de manière plus circonstancielle
    Si nous nous sommes tous trompés quant au sujet (apparemment ou prétendûment) précis de votre demande, à savoir trois chiffres significatifs, je répète que vous n'avez rectifié cette erreur à aucun moment, même lorsque vous avez apporté des précisions complémentaires et évoqué votre imprécision initiale
    D'où mon post, mais mea culpa, je n'ai pas été assez précis dans l'exposé de ma problématique et je m'en excuse.
    Personnellement, j'avais relevé cette demande, mais m'étais rallié à l'évolution de la discussion, tant du fait
    - que tous les exemples de votre premier message pouvaient relever de l'arrondi et que les deux ci-dessous en relevaient indubitablement
    - de votre absence de réaction :
    exemple pour 3 chiffres significatif
    ...
    12.36 => 12.4
    0.00124 => 0.001
    Par après, vous avez encore fourni l'exemle suivant :
    NumDepart = 2.3694
    resultat est un numérique (10,3)
    cela me retourne 2.369 au lieu de 2.37
    Donc, vous sembliez bien - dans tous ces cas - attendre des arrondis plutôt que des nombres répondant aux critères des chiffres significatifs qui auraient été : 0.00124 et 2.36 ou 2.369.
    Or la notion de chiffre significatif (exclut ou à tout le moins) n'implique pas l'arrondi.

    Enfin, c'est bien beau de venir in fine et a posteriori nous faire une leçon sur les chiffres significatifs, puis d'évoquer notre confusion sans la moindre once d'auto-critique alors que
    1. vous n'avez pas réagi précédemment et avez laissé les intervenants déployer leurs efforts en partie inutilement
    2. certains exemples utilisés dans vos questions sortent du champ de la définition du concept évoqué et illustrent, sans le moindre doute possible, l'application de l'arrondi
    3. vous prenez en même temps des libertés étonnantes, tant par rapport au rappel rigoureux de la notion, que par rapport aux besoins que vous avez exprimés.
    • D'où vient cette affirmation que "les chiffres au delà du 3 sont négligeables"
    • Qu'est-ce qui vous permet d affirmer 'crânement' : "Et bien si j'ai 123156 puisque la taille de la partie entière est supérieure à 3 je renvoi 123156 "
    • Où nous a-t-il été dit que dans votre application "le cas ne se présentera pas ou au pire il y aura une conversion d'unité qui sera faite" et je ne vois d'ailleurs pas très bien quelle conversion serait automatiquement faite si votre application ne la prend pas en charge


    Quant à votre couplet sur les solutions pré-mâchées, il me laisse pantois : il ne vous a en aucun cas été reproché de tenter de sucer la substantifique moelle des uns ou des autres, il était juste constaté que vous n'aviez pas été assez précis dans votre description. Suite à vos explications, on ne peut plus que verser dans le reproche et s'interroger sur votre manière de travailler.

    Pour autant que de besoin, j'attire votre attention sur le fait que je formule ces reproches 'de l'extérieur' puisque je n'ai proposé aucune solution.

    Pour terminer sur une note plus positive, je renvoie chacun à l'entrée de Wikipédia qui traite des chiffres significatifs.
    Comme cela, nous aurons rafraîchi et précisé nos connaissances si nécessaire.

    Hemgé

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

Discussions similaires

  1. afficher un nombre réel avec virgule
    Par alias2015_29 dans le forum Débuter
    Réponses: 7
    Dernier message: 16/01/2015, 16h45
  2. [Batch] Nombre de fichier qui ne correspond pas avec le nombre réel
    Par chuspyto dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 24/09/2013, 00h50
  3. Problème avec INSERT INTO et nombre réel
    Par minooo dans le forum JDBC
    Réponses: 4
    Dernier message: 09/09/2011, 15h10
  4. Réponses: 9
    Dernier message: 03/11/2010, 18h36
  5. Réponses: 3
    Dernier message: 25/06/2008, 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