Usando printf para arredondar 49,765 para 49,77?

Usando printf para arredondar 49,765 para 49,77?

49.765 é minha saída de um anel de comandos. Quero usar print f para arredondá-lo em duas casas decimais para 49,77.

Qual é o código para isso?

Responder1

$ x=49.765
$ printf "%.2f" $(echo "$x + 0.005" | bc)

Você precisa usar comandos externos porque não há recurso de arredondamento integrado printf(1)e o shell POSIX não possui aritmética de ponto flutuante integrada.

Para arredondar para o dígito decimal mais próximo, você adiciona 0,5 e trunca. Para arredondar para o décimo mais próximo, você divide o "fator de empurrão" por 10 e assim por diante.

Essa falta de recursos integrados é o que muitas vezes leva as pessoas a usar algo como Perl em vez de shell:

$ perl -e 'printf "%.2f", 49.765 + 0.005'

A mesma coisa, mas tudo tratado por um único processo.

Responder2

Você pode usar o seguinte comando para arredondar.

número flutuante = 49,765; printf("%0.2f", número);

Você deve conseguir obter os 2 dígitos após a vírgula decimal.

Mas isso apenas será impresso, não atualizará o valor. Se você quiser alterar o valor da variável, você deve usar abaixo.

#include <math.h>

float val = 49.765;

float rounded_down = floorf(val * 100) / 100;   /* Result: 49.76 */
float nearest = roundf(val * 100) / 100;  /* Result: 49.77 */
float rounded_up = ceilf(val * 100) / 100;      /* Result: 49.77 */

Observe que existem três regras de arredondamento diferentes que você pode escolher: arredondar para baixo (ou seja, truncar após duas casas decimais), arredondar para o mais próximo e arredondar para cima. Normalmente, você deseja arredondar para o mais próximo.

Como vários outros apontaram, devido às peculiaridades da representação de ponto flutuante, esses valores arredondados podem não ser exatamente os valores decimais "óbvios", mas serão muito próximos.

Responder3

Capture a saída do "anel de comandos" em uma variável e use printf.

$ x=49.765

$ printf '%.2f\n' "$x"
49.76

O arredondamento é feito sobre a representação binária do número com a regra do arredondamento para o empate mais próximo para o par. Por favor, entenda que a representação binária não é exatamente igual ao número fornecido na maioria dos casos.

informação relacionada