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

Shell et commandes GNU Discussion :

Arrondir au demi-point supérieur


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 16
    Par défaut Arrondir au demi-point supérieur
    Bonjour,
    existe-t-il une fonction/commande (style bc (ou autre))
    pouvant être plus simple que la partie awk ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # arrondir au demi-point supérieur
    echo "
    41.25
    16.51
    16.50
    16.99" | while read valeur ; do
    awk ' 
    {unite=(substr($1,1,2))};
    {decimal=(substr($1,4,2))}; 
    {if (decimal<=50){decimal=50}};
    {if (decimal>50) {decimal=00;unite=unite+1}};
    {print unite,decimal}'
    done

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    • D'abord, le 'while' ne sert à rien.
    • Ensuite, les accolades multiples ne servent à rien.
    • La partie entière et la division entière peuvent être suffisantes pour faire cet "arrondi"
    • Faut-il vraiment considéré 50 comme allant en dessous et pas au dessus? Non, parce que, là, tu fais une distorsion. Il y a plus d'arrondis à 50 que d'arrondi à 00. (00 à 50 contre 51 à 99, 51 contre 49)
    • Les nombres peuvent-ils être négatifs?
    • Les nombres ont-ils toujours 2 décimales? (en entrée et en sortie)


    2 propositions en attendant tes confirmations:
    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
    25
    26
    27
    28
    $ echo -e "41.25\n16.51\n16.50\n16.99\n16.49\n16.48\n16.3\n16.0"
    41.25
    16.51
    16.50
    16.99
    16.49
    16.48
    16.3
    16.0
    $ echo -e "41.25\n16.51\n16.50\n16.99\n16.49\n16.48\n16.3\n16.0" | awk '{print int(2*$0+0.99)/2}' 
    41.5
    17
    16.5
    17
    16.5
    16.5
    16.5
    16
    $ echo -e "41.25\n16.51\n16.50\n16.99\n16.49\n16.48\n16.3\n16.0" | awk '{printf "%0.2f\n",int(2*$0+0.99)/2}' 
    41.50
    17.00
    16.50
    17.00
    16.50
    16.50
    16.50
    16.00
    $

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 16
    Par défaut
    Merci pour ta réponse :
    [QUOTE=Flodelarab;7541796]
    Bonjour

    • D'abord, le 'while' ne sert à rien.
      Rep: celui-ci servira par la suite car à la place de l'echo, ce sera un fichier importé
    • Ensuite, les accolades multiples ne servent à rien.
      Rep: oui, c'est vrai.
    • La partie entière et la division entière peuvent être suffisantes pour faire cet "arrondi"
      Rep: d'accord, c'est même mieux.
    • Faut-il vraiment considéré 50 comme allant en dessous et pas au dessus? Non, parce que, là, tu fais une distorsion. Il y a plus d'arrondis à 50 que d'arrondi à 00. (00 à 50 contre 51 à 99, 51 contre 49)
      Rep: en fait,
      51 --> 00 = 00
      01 --> 50 = 50
    • Les nombres peuvent-ils être négatifs?
      non, pas de négatif
    • Les nombres ont-ils toujours 2 décimales? (en entrée et en sortie)
      non, il y aura des chiffres du style 8.32 mais je pense que je vais les mettre en 08.32



    pour ce qui est du 0.99;en poussant un peut plus, j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo "16.501" | awk '{print int(2 * $0+1) / 2;}'   # donne 17
    echo "16.501" | awk '{print int(2 * $0+0.99) / 2;}'   # donne 16.5
    echo "16.499" | awk '{print int(2 * $0+0.99) / 2;}'   # donne 16.5
    echo "16.499" | awk '{print int(2 * $0+1) / 2;}'   # donne 16.5
    bien que cela n'a pas d'incidence sur le résultat à 2 décimal, je me demandais s'il ne faudrait pas remplacer 0.99 par 1 ?

    et pour python:
    je pense que cela sera plus lourd à mettre en oeuvre en python par rapport à la "simple" ligne de awk.

    cordialement,

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    • Pour le while (+read), je reste dubitatif. On peut traiter un fichier, ou le résultat d'une commande dans une conduite, ou le résultat d'une commande sans conduite (par substitution de processus).
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      awk 'monscript' monfichier.txt
      ./macommande.bash | awk 'monscript'
      awk 'monscript' <( ./macommande.bash )
    • Pour l'idée d'ajouter 1, c'est pas mal mais 16.5 s'arrondit à 17.
      Ça se complique car la fonction int de awk n'est pas une vraie partie entière. Elle donne la partie entière de la valeur absolue. Sinon, on aurait multiplié par un négatif et obtenu l'arrondi au dessus comme demandé.
      D'autre part, si on ne connait pas le pas minimum, on ne peut pas ajouter quelque chose autour de 1 (comme 0.99).
      La réponse au premier post est presque "non, ce n'est pas possible de faire autrement".

      La solution par le calcul peut être: int(2*$0)/2 + 0.5*(int(2*$0)==2*$0?0:1)

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      $ echo -e "41.25\n16.51\n16.50\n16.99\n16.49\n16.48\n16.3\n16.0\n16.501" | awk '{print $0" -> "int(2*$0)/2+0.5*(int(2*$0)==2*$0?0:1)}'
      41.25 -> 41.5
      16.51 -> 17
      16.50 -> 16.5
      16.99 -> 17
      16.49 -> 16.5
      16.48 -> 16.5
      16.3 -> 16.5
      16.0 -> 16
      16.501 -> 17


    Le formatage éventuel est le même que décrit précédemment.

    Bonne suite

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par trauqnej Voir le message
    Bonjour,
    existe-t-il une fonction/commande (style bc (ou autre))
    pouvant être plus simple que la partie awk ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # arrondir au demi-point supérieur
    echo "
    41.25
    16.51
    16.50
    16.99" | while read valeur ; do
    awk ' 
    {unite=(substr($1,1,2))};
    {decimal=(substr($1,4,2))}; 
    {if (decimal<=50){decimal=50}};
    {if (decimal>50) {decimal=00;unite=unite+1}};
    {print unite,decimal}'
    done
    Salut
    Tu peux passer par la fonction round() de Python. Toutefois comme le dit Flodelarab, la règle mathématique dit que dès que l'arrondi supérieur se fait dès que la décimale atteint 5 et non quand elle la dépasse.
    De plus, même si tu restes avec awk, vaudrait mieux te baser sur le point décimal pour isoler la partie entière plutôt que sur le nombre de décimales qui peut évoluer dans le futur. C'est plus souple...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 16
    Par défaut arrondir au plus juste
    Bonjour,
    je crois que je vais prendre ta solution, elle est plus sur, et meilleur.

    Merci pour ton aide

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

Discussions similaires

  1. Arrondir un nombre à sa valeur supérieure ou inférieure
    Par philben dans le forum Contribuez
    Réponses: 5
    Dernier message: 08/02/2013, 12h35
  2. [8.5][formule] Arrondir une valeur au supérieur
    Par ickyknox dans le forum Formules
    Réponses: 3
    Dernier message: 07/05/2007, 16h41
  3. arrondir à l'unité supérieur
    Par ericmart dans le forum Langage
    Réponses: 2
    Dernier message: 28/06/2006, 14h23
  4. Comment arrondir à l'entier supérieur ?
    Par kuranes dans le forum Access
    Réponses: 3
    Dernier message: 29/11/2005, 17h42
  5. Arrondir à la dizaine supérieure
    Par laurent35 dans le forum Access
    Réponses: 3
    Dernier message: 28/11/2005, 14h37

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