Como arredondar ou converter um valor flutuante para int com bc? Obtendo: “(standard_in) 1: erro de sintaxe”

2

Vou obter valor como 2743410360.320 e quero um valor como 2743410360 para uma variável.

Eu tentei

INTValueOfGB=$ echo "($gb+0.5)/1" | bc

Mas estou recebendo (standard_in) 1: syntax error

    
por vin 15.11.2013 / 12:11

4 respostas

3

Você pode usar printf para arredondamento:

$ printf "%.0f" 2743410360.320
    
por 15.11.2013 / 12:36
2
$ p=2743410360.320
$ echo $p
2743410360.320
$ echo ${p%%.*}
2743410360
    
por 15.11.2013 / 12:26
1

Eu não vejo uma resposta para o problema do @ vin, que é:

But I am getting (standard_in) 1: syntax error

O comando bc imprime (standard_in) 1: syntax error porque a variável gb da shell não está definida:

$ unset gb
$ echo "($gb+0.5)/1" | bc
(standard_in) 1: syntax error

$ gb=2743410360.320
$ echo "($gb+0.5)/1" | bc
2743410360

Nos comentários à resposta do @ dchirikov, @vin diz que printf "%.0f" não está funcionando:

$ unset gb
$ printf '%.0f\n' $gb
0

$ gb=2743410360.320
$ printf '%.0f\n' $gb
2743410360

Em ambas as áreas onde @vin tem problemas, a variável unset reproduz o problema, e a configuração da variável resolve o problema.

    
por 01.11.2015 / 21:32
0

Seu comando precisa de alguns ( ) :

INTValueOfGB=$( echo "($gb+0.5)/1" | bc )

Mas isso não arredondará o número, para que isso funcione, você precisa definir a escala como 0:

INTValueOfGB=$( echo "scale=0;($gb+0.5)/1" | bc )

Isso arredondará (de x.5) para o próximo inteiro.

Para "arredondar para o próximo número inteiro" (Regra do banqueiro), é necessário usar o arredondamento de impressão:

LC_NUMERIC=C printf "%.0f" 2743410360.320

O LC_NUMERIC serve para garantir que os números sejam processados com um ponto como decimal. Não é isso que os usuários na Alemanha gostariam de usar, isso deve funcionar com decimais com , :

$ LC_NUMERIC=de_DE.utf8 printf "%.0f" 2743410360,320
2743410360
    
por 01.11.2015 / 20:28