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 : 40
    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

  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/;

  3. #3
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 39
    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 : 40
    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...

  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/;

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    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

  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.

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    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

  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";

  10. #10
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 39
    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.

  12. #12
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 39
    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.

  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";

+ 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