Redondeo hacia arriba y hacia abajo

Mi arduino mide la temperatura y da valores como: 28.58 Degrees Celcius. Me gustaría redondear esto a un decimal. Podría hacer la variable más corta cortando el «8» que mostraría 28.5. Sin embargo, esto se siente un poco como una trampa, ya que matemáticamente no es correcto. ¿Alguien sabe cómo redondear hacia arriba / hacia abajo? Lo que mostraría mi temperatura como 28.6.

Se necesitan consejos adicionales. Estoy enviando la temperatura por serial a mi RPi que tiene un código Python en ejecución. ¿Sugeriría hacer el redondeo en el código Arduino o en el código Python?

¡Gracias de antemano!

Comentarios

  • No sería ' que fuera Es mejor redondear al más cercano en lugar de redondear sistemáticamente.
  • Sí, me encantaría poder redondearlo de forma matemática. 28.65 <, se convertirá en 28.6 y 28.65 ≥, se convertirá en 28.7
  • Entonces deje que Serial.print() haga el redondeo, como según la respuesta de @Jot '.
  • Personalmente, no redondearía hasta que los datos estén en el Pi. ¿Por qué perder precisión cuando ' no es necesario? ¿Qué pasa si, en algún momento posterior, decides que necesitas hacer más cálculos sobre los datos del Pi? Python tiene una función round () incorporada.

Respuesta

Hasta donde yo sé, el Serial.print (o println) hace redondeo hacia arriba y hacia abajo. Todo lo que tienes que hacer es tomar una variable flotante y hacer Serial.print( value, 1);

Sin un parámetro adicional, se elige el valor predeterminado, que es de 2 dígitos decimales: Serial.print( value, 2);

¿Por qué quiere acortar los bytes en el Serial? También puede enviar dos dígitos decimales y procesar el valor en Python.

Comentarios

  • De eso se trata la última parte de mi pregunta; ) preguntándome dónde procesar, en python en mi Rpi o antes de enviar.
  • Cualquier redondeo debe realizarse lo más cerca posible del resultado final. Si su puerto serie es lo suficientemente rápido, envíe 2 o 3 dígitos y redondee cuando el Pi esté emitiendo los datos. No ' no desea basar los cálculos en valores redondeados si puede evitarlo, lo que introduce la posibilidad de errores. Dicho esto, es ' una completa pérdida de tiempo enviando números aleatorios, si el sensor de temperatura tiene un error de +/- 1 grado, entonces el primer decimal puede ser útil, cualquier cosa después de eso es sin sentido.
  • ¡De acuerdo! Es más preciso procesar en la etapa final, pero la precisión del sensor no está ahí, así que ahorraré ancho de banda usando Serial.print (valor, 1);

Responder

Puede redondear en C multiplicando por el significado, sumando +0,5, redondeando hacia abajo (equivale a convertir a un número entero) y dividiendo.

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 

En Python es igual (excepto que el operador de conversión es int ( …)

Actualización: para números negativos +0.5 debería ser -0.5

Créditos para Edgar Bonet: uso de trabajos redondos para números positivos y negativos:

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

Comentarios

  • Esto redondearía -28.58 a -28.5.
  • @JohnnyMopp Actualicé mis respuestas, gracias por el comentario
  • ¿Por qué no solo float f_rounded = round(f * 10) / 10.0;? Esto maneja tanto los casos positivos como los negativos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *