Aproximar um número de ponto flutuante com o arredondamento correto

3

Como posso aproximar um número de ponto flutuante usando o shell-script (digamos, até 4 dígitos após o ponto decimal)? Eu tenho dois exemplos:

A=1.2345678 e B=1.2345678E-05 .

Por isso, gostaria de obter A=1.2346 e B=1.2346E-05 .

Eu posso fazer um trabalho rápido para A usando cut :

A='echo $A | cut -c1-6'

Mas isso me dá A=1.2345 onde eu esperava que o último dígito arredondado fosse 6 (já que o próximo dígito é maior que 5). Também funciona apenas para um dígito antes do ponto decimal (e se eu quiser aproximar 100.2345678 ?) O mesmo vale para B também.

    
por hbaromega 26.06.2015 / 16:11

1 resposta

8

Use printf :

$ printf "%.4f\n" "$A"
1.2346
$ printf "%.4f\n" "$B"
0.0000
$ printf "%.4e\n" "$B"
1.2346e-05
$ printf "%.14f\n" "$B"
0.00001234567800
$ printf "%.4g\n" "$B"
1.235e-05
$ printf "%.4g\n" "$A"
1.235

Como %e pode alterar o expoente, para manter o mesmo, você pode usar o manipulação de string apresenta para separar o número do expoente e imprimir cada um separadamente:

$ B=100.12345678E-05  
$ printf '%.5fE%s\n' "${B%E*}" "${B##*E}"
100.12346E-05

O ${B%E*} imprime tudo até o primeiro E e ${B##*E} é tudo após o primeiro E .

    
por 26.06.2015 / 16:19