bash
não pode fazer a matemática de ponto flutuante, mas você pode fingir coisas como essa se não precisar de muita precisão:
$ number=248
$ echo $(( number*80/100 ))
198
como calcular a porcentagem do número
por exemplo, definimos
number=248
e queremos saber quais são os 80% de $ number
então como calcular isso em bash?
saída esperada 198 (exatamente é 198.4 mas queremos arredondar para baixo com piso)
O próprio Bash não consegue lidar com a matemática de ponto flutuante.
A melhor aposta é usar bc
assim:
$ bc <<<"248*80/100"
198
O shell (bash, sh) é capaz de calcular apenas inteiros:
$ bash -c 'echo $((248*80/100))'
198
O ksh93 é capaz de lidar com matemática de ponto flutuante:
$ ksh -c 'echo $((248*0.8))'
198.4
E com um formato de 0 decimais:
$ ksh -c 'printf "%.0f\n" "$((248*0.8))"'
O zsh faz isso de maneira diferente:
$ zsh -c 'echo $((248*0.8))'
198.40000000000001
Mas vai cair para o valor correto se formatado:
$ zsh -c 'printf "%.0f\n" "$((248*0.8))"'
198
Além disso, o awk pode fazer isso:
$ awk -vn=248 'BEGIN{print(n*0.8)}'
198.4
Ou com zero decimais:
$ awk -vn=248 'BEGIN{printf("%.0f\n",n*0.8)}'
198
Com a expressão awk
:
$ number=248
$ awk -v n="$number" 'BEGIN{ print int(n*0.8) }'
198
Assumindo que p
e n
sejam positivos e p*n + 100
não transbordem o número inteiro máximo, p
por cento de n
é
arredondando para baixo:
$(( p*n / 100 ))
arredondamento para o mais próximo, meio round up:
$(( (p*n+50) / 100 ))
arredondamento:
$(( (p*n+99) / 100 ))
Tags bash numeric-data