Usando printf para arredondar 49.765 para 49.77?

1

49.765 é minha saída de um anel de comandos. Eu quero usar a impressão f para arredondá-lo por duas figuras decimais para 49,77.

Qual é o código para isso?

    
por Shawn 01.10.2016 / 06:04

2 respostas

3

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

Você tem que usar comandos externos porque não há recurso de arredondamento embutido em printf(1) , e o shell POSIX não possui aritmética de ponto flutuante embutida.

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 deslocamento" por 10 e assim por diante.

Esta falta de recursos embutidos é o que muitas vezes leva as pessoas a usar algo como Perl ao invés de shell:

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

Mesma coisa, mas tudo tratado por um único processo.

    
por 01.10.2016 / 06:41
0

Você pode usar o seguinte comando para arredondar.

número de flutuação = 49,765; printf ("% 0.2f", number);

Você deve conseguir os 2 dígitos após o ponto decimal.

Mas isso só será impresso, não atualizará o valor. Se você gostaria de mudar o valor da variável, então 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 há três regras de arredondamento diferentes que você pode escolher: arredondar para baixo (ou seja, truncar após duas casas decimais), arredondado para o mais próximo e arredondar para cima. Normalmente, você quer arredondar para 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 eles estarão muito próximos.

    
por 01.10.2016 / 06:43

Tags