Bash limitando a precisão de variáveis de ponto flutuante

5

No Ubuntu 14.04.1 LTS 64-bit bash Eu estou descartando as variáveis de ponto flutuante multiplicando as variáveis bash do ponto flutuante em bc pela escala definida como 3; no entanto, não consigo obter o número de dígitos após o ponto decimal para zero e me livrar do zero à esquerda do ponto decimal. Como posso transformar, digamos 0.005000000 em .005 ? Isso é necessário devido à minha convenção de nomenclatura de arquivos. Obrigado pelas suas recomendações.

UPDATE: Posso usá-lo para variáveis de shell já definidas e redefini-las? O código a seguir me dá um erro.

~/Desktop/MEEP$ printf "%.3f\n" $w
bash: printf: 0.005000: invalid number
0,000

A saída da localidade

@vesnog:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=tr_TR.UTF-8
LC_TIME=tr_TR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=tr_TR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=tr_TR.UTF-8
LC_NAME=tr_TR.UTF-8
LC_ADDRESS=tr_TR.UTF-8
LC_TELEPHONE=tr_TR.UTF-8
LC_MEASUREMENT=tr_TR.UTF-8
LC_IDENTIFICATION=tr_TR.UTF-8
LC_ALL=

A saída de echo $w

@vesnog:~$ echo $w
0.005000
    
por Vesnog 24.12.2014 / 10:09

2 respostas

7

Uma maneira simples é usar printf :

$ printf "%.3f\n" 0.005000000000
0.005

Para remover o 0 inicial, basta analisá-lo com sed :

$ printf "%.3f\n" 0.005000000000 | sed 's/^0//'
.005
    
por 24.12.2014 / 10:17
4

Existe uma variável especial chamada scale . Você pode definir essa variável para limitar a precisão.

EXEMPLO

echo "300/7" | bc -l

Saída:

42.85714285714285714285

Para limitar a precisão,

echo "scale=2; 300/7" | bc -l

Saída:

42,85

ATUALIZADO

echo "scale=3; 300/7" | bc -l | sed 's/[0-9]*\././g'

Saída:

.857

    
por 24.12.2014 / 11:04