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
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.
Serial.print()
fazer o arredondamento, como pela resposta de @Jot '.