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

Langage Perl Discussion :

afficher un nombre avec seulement deux décimale (pb d'arrondi)


Sujet :

Langage Perl

  1. #1
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut afficher un nombre avec seulement deux décimale (pb d'arrondi)
    bonjour,
    voila je récupère un nombre qui a beaucoup de décimales, je voudrai donc n'en afficher que deux
    si je fais un printf ("0.2f", $maVariable), cela met les deux décimales à zéro
    999,999999 devient 999,00
    j'ai aussi essayé en passant par sprintf mais le résultat est toujours le même...

    comment faire?
    merci de votre aide
    dam's

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    comment faire?
    Peut-être une substitution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $maVariable = 99.999999;
    $maVariable =~ s/(\.\d{2})\d*/$1/;
    -- Jasmine --

  3. #3
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $maVariable = 999.999999;
    $maVariable = int($maVariable*100)/100;
    print "$maVariable";

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut
    merci de ton aide, seulement cela ne change rien, cela ne fait aucune concaténation au niveau des décimales
    j'avais déjà vu le d{2} mais cela ne faisait rien non plus...
    dam's

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Désolée, je n'avais pas vu que tu utilisais une virgule ... j'ai utilisé un point dans mon expression régulière.

    Utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $maVariable =~ s/(,\d{2})\d*/$1/;
    -- Jasmine --

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut
    impécable ça fonctionne
    simple précision, cela ne fait pas d'arrondis? cela tronque c'est tout?

    merci
    dam's

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par dams78 Voir le message
    impécable ça fonctionne
    simple précision, cela ne fait pas d'arrondis? cela tronque c'est tout?

    merci
    Oui, cela récupère les 2 chiffres après la virgule, n'est-ce pas ce que tu voulais?

    Pour arrondir, regarde sur CPAN, tu as plusieurs modules permettant cela.
    -- Jasmine --

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut
    oui oui biensûr c'est ce que je voulais, je me posais juste la question
    merci
    dam's

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    La solution d'Oliver.p avec arrondi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $maVariable = 999.999999;
    $maVariable = int($maVariable*100+50)/100;
    print "$maVariable";
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Hmmm je dirais que l'arrondi n'est pas géré avec ta méthode Philou.

    999,99999 * 100 = 99999,999 +50 = 100049,999 int -> 100049 / 100 = 1000,49
    Alors que l'on attendait 1000,00 (arrondi à 0,01 près).

    Pourquoi +50 ? +1 ça marche bien pour l'exemple aussi (même mieux !) mais bon le +X ne marche qu'en fonction du X.

    à la limite une condition sur la troisième valeur décimale en fonction de si elle est plus petite que 5 ou non pour savoir si on incrémente de 1 ou de -1 le nombre X multiplié par 100.... Ca devient compliqué non ?

    une méthode plus simple pour avoir l'arrondi ? (je sais ça ne répond pas à la question initiale mais le problème reste entier (humour) )

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ca ne marche pas, parce que j'ai écrit une grosse bêtise
    La formule qui marche est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $maVariable = 999.999999;
    $maVariable = int($maVariable*100+0.5)/100;
    print "$maVariable";
    En fait, c'est toujours 0,5 qu'il faut ajouter au nombre avant de prendre la partie entière.
    Si les chiffres après la virgule sont < 0,5, le fait d'ajouter 0,5 et de prendre la partie entière ne modifie pas la valeur de la partie entière sans ajouter les 0,5.
    En revanche, si les chiffres sont > 0,5, le fait d'ajouter 0,5 va augmenter de 1 le nombre, et faire l'arrondi supérieur.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Bien vu

  13. #13
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Et bien, et bien quel débat pour une question qui paraissait pourtant si simple.
    Néanmoins, le problème reste que $maVariable possédant une virgule, il ne sera pas reconnu comme un nombre par Perl. ^^ faudra donc d'office passer par une substitution à moins qu'il n'existe une autre option.
    -- Jasmine --

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    J'aurais tendance à dire, pour régler le problème de la virgule, qu'il conviendrait d'utiliser la localisation française pour les types numériques, en définissant LC_NUMERIC, mais je ne peux vérifier car cette locale ne semble pas installée sur ma configuration.

    A essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use locale;
    use POSIX (strtod locale_h);
     
    setlocale(LC_NUMERIC, "fr_FR");
    my $maVariable = "999,999999"; # ou $maVariable = strtod("999,999999");
    $maVariable = int($maVariable*100+0.5)/100;
    print "$maVariable";
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

Discussions similaires

  1. Tri fusion avec seulement deux listes
    Par CrashBC dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 04/01/2014, 01h02
  2. Tester si un nombre a que deux décimales
    Par siriu dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 09/11/2010, 10h18
  3. Afficher un nombre avec 'write()'
    Par saturn1 dans le forum C
    Réponses: 3
    Dernier message: 08/10/2009, 14h30
  4. Réponses: 8
    Dernier message: 06/04/2006, 09h01
  5. Afficher un nombre avec 2 décimales.
    Par Higestromm dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2006, 16h12

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