Arredondando para cima e para baixo

Meu arduino está medindo a temperatura e fornece valores como: 28,58 graus Celsius. Eu gostaria de arredondar para uma casa decimal. Eu poderia tornar a variável mais curta cortando o “8”, que mostraria 28,5. No entanto, isso parece um pouco como trapaça, pois matemática não está correta. Alguém sabe arredondar para cima / para baixo. O que mostraria minha temperatura como 28,6.

Conselhos extras necessários. Estou enviando a tempature por Serial para meu RPi que tem um código python em execução. Você sugere fazer o arredondamento no código do Arduino ou no código do Python.

Obrigado desde já!

Comentários

  • Não ' que seja melhor arredondar para o mais próximo em vez de arredondar sistematicamente para cima.
  • Sim, eu adoraria ser capaz de arredondar para o modo matemático. 28,65 <, se tornará 28,6 e 28,65 ≥, se tornará 28,7
  • Então deixe Serial.print() fazer o arredondamento, como pela resposta de @Jot '.
  • Pessoalmente, eu não arredondaria até que os dados estivessem no Pi. Por que perder a precisão quando você não ' não precisa? E se, em algum momento posterior, você decidir que precisa fazer mais cálculos sobre os dados do Pi? Python tem uma função round () incorporada.

Resposta

Até onde eu sei, o Serial.print (ou println) faz arredondamentos para cima e para baixo. Tudo que você precisa fazer é pegar uma variável flutuante e fazer Serial.print( value, 1);

Sem parâmetro extra, o padrão é escolhido, que é 2 dígitos decimais: Serial.print( value, 2);

Por que você deseja encurtar os bytes no Serial? Você também pode enviar dois dígitos decimais e processar o valor em Python.

Comentários

  • Essa é a última parte da minha pergunta; ) me perguntando onde processar, em python no meu Rpi ou antes de enviar.
  • Qualquer arredondamento deve ser feito o mais próximo possível da saída final. Se sua porta serial for rápida o suficiente, envie 2 ou 3 dígitos e arredonde quando o Pi estiver emitindo os dados. Você não ' não deseja basear os cálculos em valores arredondados se puder evitar, pois isso introduz a possibilidade de erros. Dito isso, ' uma completa perda de tempo enviando números aleatórios, se o sensor de temperatura tiver um erro de +/- 1 grau, a primeira casa decimal pode ser útil, qualquer coisa depois disso é sem sentido.
  • Ok, concordou! É mais preciso processar no estágio final, mas a precisão do sensor não está lá, então vou economizar largura de banda usando Serial.print (valor, 1);

Resposta

Você pode arredondar em C multiplicando pela significância, adicionando +0,5, arredondar para baixo (igual à conversão para um inteiro) e dividir.

float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0); 

28.6 será:

float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6 

Em Python é igual (exceto o operador de conversão é int ( …)

Atualização: para números negativos +0,5 deve ser -0,5

Créditos para Edgar Bonet: usando rodadas para números positivos e negativos:

float f_rounded = round(f * 10) / 10.0; 

Comentários

  • Isso arredondaria -28.58 para -28.5.
  • @JohnnyMopp Atualizou minhas respostas, obrigado pelo comentário
  • Por que não apenas float f_rounded = round(f * 10) / 10.0;? Isso controla os casos positivos e negativos.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *