Como imprimir os três primeiros dígitos após o ponto decimal de um número flutuante?

3

Sou novo no BASH e aprendi que printf e echo gravam na saída padrão. Mas, eu vim através do seguinte exemplo, que lê uma expressão da entrada e calcula o resultado para a precisão de 3 casas decimais:

read exp
printf "%.3f\n" "$(echo $exp | bc -l)"

Eu não entendo porque o eco é passado aqui como um argumento na declaração printf . Existe algum outro maneira de representar a declaração usando apenas echo ?

    
por coder_r 29.10.2014 / 08:57

2 respostas

2

Depois de read exp , você pode usar echo da seguinte forma:

$ echo "scale=3; $exp/1" | bc
9.456

Mas observe que esse comando não exige echo :

$ bc <<< "scale=3; $exp/1"
9.456

EDIT : para obter um resultado arredondado, você tem que usar o printf bash embutido, pois bc não pode arredondar valores.

O seguinte comando funciona como esperado:

 echo "scale=4; $exp" | bc | xargs printf "%.3f\n"
    
por Sylvain Pineau 29.10.2014 / 09:28
2

Aqui está uma solução usando apenas echo :

  • se você estiver usando um ponto decimal ( . ) em seu número racional:

    $ read exp
    123.4567
    $ int=${exp%%.*}
    $ rat=${exp##*.}
    $ echo $int.${rat:0:3}
    123.456
    
  • se você estiver usando uma vírgula decimal ( , ) em seu número racional (como eu uso e a maior parte da Europa continental):

    $ read exp
    123,4567
    $ int=${exp%%,*}
    $ rat=${exp##*,}
    $ echo $int,${rat:0:3}
    123,456
    

Para mais informações, consulte Guia avançado de script de script: Manipulando strings .

    
por Radu Rădeanu 29.10.2014 / 12:55