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?


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

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
    

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.