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
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.
Serial.print()
haga el redondeo, como según la respuesta de @Jot '.