2014-10-20 20 views
15

Ok, quindi sto cercando di arrotondare un input di 17.92857, in modo che ottenga un input di 17.929 in bash.Arrotondare i numeri in virgola mobile bash

Il mio codice finora è:

read input 
echo "scale = 3; $input" | bc -l 

Tuttavia, quando io uso questo, non arrotondare, restituisce 17.928.

Qualcuno sa qualche soluzione a questo?

+0

[guarda a questo] (http://stackoverflow.com/a/2395601/3913686) –

+0

È possibile utilizzare 'printf -v output"% .3f \ n "" $ input "' per assegnare l'output di printf alla variabile $ output. – Cyrus

+0

Deve provenire da hackerrank (https://www.hackerrank.com/challenges/bash-tutorials---arithmetic-operations) – bergie3000

risposta

19

Nel caso input contiene un numero, non è necessario un comando esterno come bc. Si può semplicemente utilizzare printf:

printf "%.3f\n" "$input" 

Edit: Nel caso in cui l'ingresso è una formula, si dovrebbe comunque utilizzare bc come in uno dei seguenti comandi:

printf "%.3f\n" $(bc -l <<< "$input") 
printf "%.3f\n" $(echo "$input" | bc -l) 
+0

Ho esteso la mia risposta, vedere se funziona per voi. –

1

Un piccolo trucco è quello di aggiungi 0.0005 al tuo input, in questo modo avrai il tuo numero arrotondato correttamente.

+0

O come @Tim ha detto usa printf –

+0

Se stai arrotondando a tre posizioni, dovresti effettivamente aggiungere '.0005', non' .005'. Ma perché non puoi farlo? –

+0

Ho modificato la mia risposta, grazie! –

-2

se ricevi l'errore di arrotondamento al numero 17,928 provare questo: lettura y v = echo "scale = 3; $y" |bc -l se [$ v == 17,928]; poi echo "17,929" altro echo $ v fi

0

È possibile scrivere una funzione di shell aiutante round ${FLOAT} ${PRECISION} per questo:

#!/usr/bin/env bash 

round() { 
    printf "%.${2}f" "${1}" 
} 

PI=3.14159 

round ${PI} 0 
echo 
round ${PI} 1 
echo 
round ${PI} 2 
echo 
round ${PI} 3 
echo 
round ${PI} 4 
echo 
round ${PI} 5 
echo 
round ${PI} 6 
echo 

# Outputs: 
3 
3.1 
3.14 
3.142 
3.1416 
3.14159 
3.141590 

# To store in a variable: 
ROUND_PI=$(round ${PI} 3) 
echo ${ROUND_PI} 

# Outputs: 
3.142 
Problemi correlati