bc: imposta il numero di cifre dopo il punto decimale


52

bc gestisce i numeri come numeri interi:

# echo "100/3" | bc
33

bc -l gestisce i numeri come oggetti in virgola mobile:

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

C'è un modo per limitare il numero di cifre dopo il punto decimale?


10
È interessante notare che questo funziona solo con la divisione. Se vuoi fare scale=0;1234*1.1, devi scriverlo scale=0;1234*1.1/1per ottenere 1357. Altrimenti, indipendentemente dal valore scale, ottieni 1357.4.
Wok,

Il commento di @Wok non dovrebbe essere sulla risposta accettata, piuttosto che sulla domanda? Fino a quando ho letto la risposta, non avevo idea di cosa si riferisse a questo commento.
Wilson F,

1
@WilsonF Aggiunto un riferimento alla risposta.
Adam Matan,

2
@Wok, non dipende dalla divisione o dalla moltiplicazione. Dipende dall'input: il numero di precisione maggiore determina la precisione nell'output. Nota come 1234*1.0ti darà1234.0
Richlv,

Risposte:


71

Imposta la scalevariabile speciale:

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

3
Vedi il commento di @ Wok ​​sulla domanda.
Adam Matan,

$ echo "scale=2; (100/180)*180" | bcdà 99.00 :(
Donatas Olsevičius,

@ DonatasOlsevičius questo perché (100/180) = 0,55 e poi (0,55 * 180) = 99. Quindi ti dà il giusto valore :)
Kamaldeep singh Bhatia

Sarebbe bello se arrotondato se sopra .5. ~$ echo "scale=2; 12/104" | bc .11 Se arrotondato per eccesso sarebbe .12. Tuttavia, dovrebbe comunque fare il lavoro per il mio compito.
jbrock,

3
È possibile mantenere la precisione fino a quando la stampa il valore in questo modo: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Adesso hai capito 99.99.
Byron Hawkins,

11

scalefunziona solo per divisione; se alcuni geek ne hanno bisogno in moltiplicazione, allora puoi farlo usando la manipolazione di stringhe. Di 'se devi moltiplicare 32 * 0.60, la risposta è 19.20. Se hai bisogno di ottenerlo da solo in risposta, puoi ottenerlo con diversi metodi.

  1. Utilizzo della manipolazione delle stringhe

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

    Sintassi di manipolazione delle stringhe: ${Variable%pattern}questo eliminerà il modello di corrispondenza breve che segue %. Per ulteriori dettagli sulla manipolazione delle stringhe, consultare la Guida avanzata di script Bash .

  2. Utilizzando Scalecome indicato da**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. Per sbarazzarsi degli 0 finali, invece della manipolazione delle stringhe, si può anche dividere per 1.

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

Si noti che, come ho già detto nel mio commento sulla domanda, non è causato dalla moltiplicazione, ma piuttosto dai numeri di input che hanno una parte decimale. Oppure, per dirla diversamente, il numero con la parte decimale "più lunga" determinerà quante posizioni decimali avrà l'output.
Richlv,

4

Oltre alle risposte precedenti

echo "scale=2; 1.0150876" | bc

ritorna

1.0150876

Aggiungi operazioni matematiche per ottenere solo 2 numeri decimali - (NUMERO * 100) / 100

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

Ora ritorna

1.01

3

puoi anche usare il comando printf per arrotondare il risultato fino a 3 decimali

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

2

Arrotondare

scale = 2 tronca la risposta a due cifre decimali, ma possiamo ottenere un arrotondamento in questo modo:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.