Forum Programmation.shell Calcul arrondi en shell

Posté par  .
Étiquettes : aucune
0
28
août
2006
Bonjour,
je voulais savoir si quelqu'un savait faire un arrondi dans des calculs en bash.
Par exemple, lorsque j'ai 19985, je voudrais obtenir 20000, ou lorsque j'ai 1024 je voudrais obtenir 1000.
Existe t-il une fonction déjà toute faite, ou dois je le coder moi même ?

Merci
  • # pas trop

    Posté par  . Évalué à 3.

    Ca n'existe pas, mais c'est vraiment trivial:


    #!/bin/bash

    function roundk {
    a=$(( $1 / 1000 ))
    b=$(( $1 % 1000 ))
    if [ $b -gt 500 ] ; then
    echo $(( $1 + 1000 - $b ))
    else
    echo $(( $1 - $b ))
    fi
    }

    echo 19985 = `roundk 19985`
    echo 1024 = `roundk 1024`
    • [^] # Re: pas trop

      Posté par  . Évalué à 2.

      Merci, c'est impeccable!
    • [^] # Re: pas trop

      Posté par  . Évalué à 2.

      quelle arnaque ce script :)

      roundk 424242 => 424000
      roundk 128 => 0

      Le hic vient du choix du diviseur 1000 qui est basé sur les exemples fournies.
      Dans un cadre général ce script ne marche pas.

      Faudrait plutôt jouer avec le logarithme en base 10 ...
      • [^] # Re: pas trop

        Posté par  . Évalué à 3.

        C'est marrant, j'avais pas du tout compris la question comme toi... Je l'avais comprise comme étant la recherche d'un arrondi au millier supérieur ou inférieur... probablement à cause des exemples.

        Si c'est un arrondi tel que seuls des 0 peuvent suivre le premier digit, pas la peine d'utiliser des log10 (heureusement parce que bonne chance en bash), ça reste trivial:


        #!/bin/bash
        function rounda {
        if [[ ${1:1:1} == "" ]] ; then
        echo "$1"
        else
        if [ ${1:1:1} -gt 5 ] ; then
        first=$(( ${1:0:1} + 1 ))
        else
        first=${1:0:1}
        fi
        echo -n $first
        l="`echo $1 | wc -c`"
        for i in `seq 2 $(($l-1))`; do echo -n "0" ; done
        fi
        }

        echo 424242 = `rounda 424242`
        echo 128 = `rounda 128`
        echo 11 = `rounda 11`


        résultat:

        424242 = 400000
        1985 = 2000
        128 = 100
        11 = 10

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.