bc: définir le nombre de chiffres après le point décimal


52

bc traite les nombres comme des entiers:

# echo "100/3" | bc
33

bc -l traite les nombres comme des objets à virgule flottante:

# echo "100/3" | bc -l
33.33333333333333333333

Existe-t-il un moyen de limiter le nombre de chiffres après le signe décimal?


10
Fait intéressant, cela ne fonctionne qu'avec la division. Si vous voulez faire scale=0;1234*1.1, vous devez l'écrire comme scale=0;1234*1.1/1pour l'obtenir 1357. Sinon, peu importe la valeur de scale, vous obtenez 1357.4.
Wok

Le commentaire de @Wok ne devrait-il pas être sur la réponse acceptée plutôt que sur la question? Jusqu'à ce que je lise la réponse, je n'avais aucune idée de ce à quoi faisait référence ce commentaire.
Wilson F

1
@WilsonF Ajout d'une référence à la réponse.
Adam Matan

2
@Wok, cela ne dépend pas de la division ou de la multiplication. Cela dépend de l'entrée - le plus grand nombre de précision détermine la précision de la sortie. Avis comment 1234*1.0va vous donner1234.0
Richlv

Réponses:


71

Définissez la scalevariable spéciale:

$ echo "scale=2; 100/3" | bc
33.33

3
Voir le commentaire de @ Wok ​​sur la question.
Adam Matan

$ echo "scale=2; (100/180)*180" | bcdonne 99,00 :(
Donatas Olsevičius

@ DonatasOlsevičius c'est parce que (100/180) = 0.55 et ensuite (0.55 * 180) = 99. Donc, cela vous donne la bonne valeur :)
Kamaldeep singh Bhatia Le

Ce serait bien si on arrondissait au dessus .5. ~$ echo "scale=2; 12/104" | bc .11 Si arrondi ce serait .12. Cependant, il devrait toujours faire le travail pour ma tâche.
Jbrock

3
Vous pouvez maintenir la précision jusqu'à l'impression de la valeur de la manière suivante echo "result = (100/180) * 180; scale=2; result / 1" | bc -l:. Maintenant vous avez 99.99.
Byron Hawkins

11

scalene fonctionne que pour la division; si certains geeks en ont besoin lors de la multiplication, vous pouvez y parvenir en utilisant la manipulation de chaîne. Dites si vous avez besoin de multiplier 32 * 0.60, la réponse est 19.20. Si vous avez besoin de l'obtenir seul en réponse, vous pouvez l'obtenir par différentes méthodes.

  1. Utilisation de la manipulation de chaîne

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    Syntaxe de manipulation de chaîne:, ${Variable%pattern}ceci supprimera le motif de correspondance court qui suit %. Pour plus de détails sur la manipulation des chaînes, voir le Guide de script de Bash avancé .

  2. Utiliser Scalecomme indiqué par**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. Pour se débarrasser des zéros de fin, au lieu de manipuler des chaînes, on peut aussi faire une division par 1.

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    

Notez que, comme je l’ai mentionné dans mon commentaire sur la question, cela n’est pas dû à la multiplication, mais plutôt au fait que les nombres en entrée ont une partie décimale. Ou, pour le dire autrement, le nombre avec la partie décimale "la plus longue" déterminera le nombre de décimales de la sortie.
Richlv

4

En plus des réponses précédentes

echo "scale=2; 1.0150876" | bc

Résultats

1.0150876

Ajoutez des opérations mathématiques pour obtenir seulement 2 nombres décimaux - (NUMBER * 100) / 100

echo "scale=2; (1.0150876 * 100) / 100" | bc

Maintenant revient

1.01

3

vous pouvez également utiliser la commande printf pour arrondir le résultat jusqu'à 3 décimales

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333

2

Arrondir

scale = 2 tronque la réponse à deux chiffres décimaux, mais nous pouvons arrondir comme ceci:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.