bc: define o número de dígitos após o ponto decimal

52

bc lida com números como números inteiros:

# echo "100/3" | bc
33

bc -l lida com números como objetos de ponto flutuante:

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

Existe uma maneira de limitar o número de dígitos após o ponto decimal?

Adam Matan
fonte
10
Curiosamente, isso só funciona com divisão. Se você quer fazer scale=0;1234*1.1, você deve escrevê-lo como scale=0;1234*1.1/1conseguir 1357. Caso contrário, não importa o valor de scale, você recebe 1357.4.
Wok
O comentário de @Wok não deveria estar na resposta aceita, e não na pergunta? Até ler a resposta, não fazia ideia do que esse comentário se referia.
Wilson F
11
@WilsonF Adicionada uma referência à resposta.
28816 Adam Matan
2
@ Wok, não depende de divisão ou multiplicação. Depende da entrada - o maior número de precisão determina a precisão na saída. Observe como 1234*1.0você vai dar1234.0
Richlv 17/08/16

Respostas:

70

Defina a scalevariável especial:

$ echo "scale=2; 100/3" | bc
33.33
cronite
fonte
3
Veja o comentário de @ Wok ​​sobre a questão.
28816 Adam Matan
$ echo "scale=2; (100/180)*180" | bcdá 99,00 :(
Donatas Olsevičius
@ DonatasOlsevičius isso é porque (100/180) = 0,55 e, em seguida, (0,55 * 180) = 99. Por isso, é o que lhe dá valor correto :)
Kamaldeep Singh Bhatia
Seria bom se arredondado acima .5. ~$ echo "scale=2; 12/104" | bc .11 Se arredondado isso seria .12. No entanto, ele ainda deve fazer o trabalho para minha tarefa.
jbrock
3
Você pode manter a precisão até imprimir o valor da seguinte maneira: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Agora você entende 99.99.
Byron Hawkins
11

scaletrabalha apenas para divisão; se alguns geeks precisarem disso em multiplicação, você pode conseguir isso usando a manipulação de strings. Diga se você precisa multiplicar 32 * 0.60, a resposta é 19.20. Se você precisar obtê-lo sozinho, em resposta, poderá obtê-lo por diferentes métodos.

  1. Usando manipulação de string

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

    Sintaxe de manipulação de string:, ${Variable%pattern}isso excluirá o padrão de correspondência curta que vem depois %. Para mais detalhes sobre manipulação de String, consulte o Advanced Bash-Scripting Guide .

  2. Usando Scalecomo indicado por**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. Para se livrar dos 0s à direita, em vez da manipulação de cordas, também é possível dividir por 1.

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    
SAGAR Nair
fonte
Observe que, como mencionei no meu comentário sobre a questão, ela não é causada pela multiplicação, mas pelos números de entrada com uma parte decimal. Ou, em outras palavras, o número com a parte decimal "mais longa" determinará quantas casas decimais a saída terá.
Richlv 17/08/19
4

Além das respostas anteriores

echo "scale=2; 1.0150876" | bc

Devoluções

1.0150876

Adicione operações matemáticas para obter apenas 2 números decimais - (NÚMERO * 100) / 100

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

Agora retorna

1.01
Michal Zmuda
fonte
3

você também pode usar o comando printf para arredondar o resultado até 3 casas decimais

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

Arredondamento

scale = 2 trunca a resposta para dois dígitos decimais, mas podemos obter o arredondamento da seguinte forma:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
espancado
fonte