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 un nombre à n décimales précisément


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut Arrondir un nombre à n décimales précisément
    Bonjour,

    Le printf %.2f arrondit selon la 3ème décimale en occultant toutes les autres de droite.
    De ce fait arrondir 0.444836 à 2 décimales, le résultat final est 0.44 au lieu de 0.45.

    Donc cela m'oblige à arrondir à chaque décimale en boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    round5=1000000; i=5; val=0.444836
    val=$(printf %."$i"f $(echo "$val/1 +$i/($i*$round5)" | bc -l )) #val=0.44484
     
    round5=$(echo "$round5 / 10" | bc); i=4; 
    val=$(printf %."$i"f $(echo "$val/1 +$i/($i*$round5)" | bc -l )) #val=0.4448
     
    printf %."3"f $(echo "0.4448/1 +3/(3*10000)" | bc -l )
    0.445
     
    printf %."2"f $(echo "0.445/1 +2/(2*1000)" | bc -l )
    0,45
    la valeur round5 permet à partir de 0.455 de donner 0.46 et non pas 0.45

    Existe-t-il svp une manière de faire plus simple ? ou une commande permettant d'obtenir le même résultat que mon usine à gaz ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 738
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 738
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ for i in 0.4445 0.5556 0.6667; do LC_NUMERIC=C printf "%.2f\n" $i; done
    0.44
    0.56
    0.67
    on voit que les arrondis sont faits comme on s'y attend à partir de 0.5
    awk fait pareil.

    mais pas bc

    àmha, ça va sentir le gaz.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Merci N_BaH...je vais garder ta solution et ne pas chipotter

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 424
    Par défaut
    Pour ceux qui veulent un noeud au cerveau (et en même temps un petit cadeau pour Jack-ft ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ printf "%.2f\n" 4,235
    4,24
    $ printf "%.2f\n" 4,245
    4,24
    Sous awk, à priori, on a pas le même comportement, mais on rencontre le cas aussi en C.
    Et ce n'est pas une erreur (voir arrondi bancaire ou arrondi au pair le plus proche)

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    C'est une dinguerie !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf "%.2f\n" 4,235
    4,24
    printf "%.2f\n" 0,235
    0,23
    La notion d'arrondi est très louche et nous donne en fait cinq solutions d'arrondis dans le domaine de l'informatique :
    - Arrondi vers moins l'infini
    - Arrondi vers plus l'infini
    - Arrondi vers zéro
    - Arrondi au plus loin de zéro
    - Arrondi au nombre pair : si à 0.5 près alors arrondi selon le bit de poids faible donc statistiquement 50% du temps au supérieur et 50% à l'inférieur

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour ceux qui veulent un noeud au cerveau (et en même temps un petit cadeau pour Jack-ft ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ printf "%.2f\n" 4,235
    4,24
    $ printf "%.2f\n" 4,245
    4,24
    Sous awk, à priori, on a pas le même comportement, mais on rencontre le cas aussi en C.
    Et ce n'est pas une erreur (voir arrondi bancaire ou arrondi au pair le plus proche)
    Merci pour le cadeau !

    C'est d'autant plus bizarre quand on teste d'autres valeurs !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ for i in {0..9}; do s=4,2${i}5; printf "%.3f -> %.2f\n" "$s" "$s"; done
    4,205 -> 4,21
    4,215 -> 4,21
    4,225 -> 4,22
    4,235 -> 4,24
    4,245 -> 4,25
    4,255 -> 4,25
    4,265 -> 4,26
    4,275 -> 4,28
    4,285 -> 4,29
    4,295 -> 4,29
    Et j'ai un peu de mal à imaginer que ce n'est pas un bug !

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 424
    Par défaut
    Y a un bug, mais chez toi (tu es sous mac ? ) car chez moi, sous debian ou ubuntu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ for i in {0..9}; do s=4,2${i}5; printf "%.3f -> %.2f\n" "$s" "$s"; done
    4,205 -> 4,20
    4,215 -> 4,22
    4,225 -> 4,22
    4,235 -> 4,24
    4,245 -> 4,24
    4,255 -> 4,26
    4,265 -> 4,26
    4,275 -> 4,28
    4,285 -> 4,28
    4,295 -> 4,30

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

Discussions similaires

  1. Arrondir un nombre décimal
    Par riyad25h dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/10/2016, 17h25
  2. Arrondir un nombre à deux décimales
    Par sic_88 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/03/2009, 21h20
  3. [Nombre]formater le nombre de décimal après une virgule.
    Par PascalCmoa dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/03/2007, 11h40
  4. Arrondir un nombre décimal
    Par tidou dans le forum Java ME
    Réponses: 5
    Dernier message: 23/01/2007, 17h43
  5. [langage] arrondir un nombre
    Par GMI3 dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2004, 12h18

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