HOWTO · Arduino
Cómo redondear un float al entero más cercano en Arduino
Aprenda cómo round() de Arduino redondea los valores de punto flotante al entero más cercano, cómo se comportan los valores positivos y negativos situados justo en el punto medio y cómo redondear a un número elegido de decimales.
En esta página
Usa la función round() de Arduino para obtener el entero más cercano a partir de un valor float. Los valores que quedan justo a mitad entre dos enteros se redondean alejándose de cero: 5.5 se convierte en 6 y -3.5, en -4. Puedes guardar el resultado como int cuando necesites un valor entero.
Qué hace round() en Arduino
round() devuelve un valor de punto flotante cuyo valor es el entero más cercano. Al asignar el resultado a un int, se guarda el valor entero. Por ejemplo, round(3.6) produce 4, mientras que round(-2.3) produce -2. La función cambia el valor que se usa en los cálculos posteriores; no modifica la variable original a menos que vuelvas a asignarle el resultado.
Este programa completo en C++ muestra cómo redondear a un entero y cómo escalar una medición para dejarla con dos decimales. Usa la función round estándar de C++, que aplica la misma regla; en un sketch de Arduino, llama a round() y envía los valores a Serial según sea necesario. El ejemplo es independiente e imprime resultados etiquetados al ejecutarlo.
#include <cmath>
#include <cstdio>
int main() {
float positive = 5.5f;
float belowZero = -3.5f;
float measurement = 7.4567f;
int roundedPositive = static_cast<int>(std::round(positive));
int roundedBelowZero = static_cast<int>(std::round(belowZero));
float roundedMeasurement = std::round(measurement * 100.0f) / 100.0f;
std::printf("positive: %d\n", roundedPositive);
std::printf("below zero: %d\n", roundedBelowZero);
std::printf("measurement: %.2f\n", roundedMeasurement);
return 0;
}
Redondear valores positivos y negativos
Para los valores positivos se elige el entero más cercano: los valores inferiores al punto medio se redondean hacia abajo y los que están en el punto medio o por encima se redondean hacia arriba. Así, 5.4 se convierte en 5, mientras que 5.5 y 5.6 se convierten en 6. En un punto medio exacto, el resultado se aleja de cero.
La misma regla del punto medio se aplica a los valores negativos. Por ejemplo, -3.4 se convierte en -3, mientras que -3.5 y -3.6 se convierten en -4. No se trata del redondeo bancario: los valores en el punto medio no cambian de dirección para favorecer un entero par. Si vas a asignar el resultado a un int, asegúrate de que el valor redondeado esté dentro del rango de ese tipo.
Redondear a una cantidad determinada de decimales
Por sí sola, round() redondea a un entero. Para redondear un valor a una cantidad determinada de decimales, multiplícalo por la potencia de diez correspondiente, llama a round() y luego divide por ese factor. Para dos decimales, el factor es 100; por ejemplo, 7.4567 se convierte aproximadamente en 7.46.
Este método de escalado sirve para muchas necesidades de visualización y cálculo, pero los valores float se almacenan con una precisión binaria finita. Es posible que un valor decimal no pueda representarse exactamente, por lo que un valor cercano al punto medio puede comportarse de forma distinta al cálculo decimal ideal. Conserva el valor original para los cálculos que requieran más precisión y dale formato para mostrarlo cuando solo necesites una cantidad fija de decimales visibles. El escalado tampoco hace que el valor almacenado sea exacto: modifica el resultado del redondeo según la precisión disponible.
Usar valores redondeados en un sketch de Arduino
En un sketch, asigna el resultado cuando te resulte útil tener un entero, por ejemplo, al elegir un índice de una matriz o mostrar una lectura como número entero. Antes de asignarlo, comprueba que el valor redondeado esté dentro del rango de int. Para mostrarlo por el puerto serie, Serial.println(round(sensorValue)); imprime el valor redondeado. El programa completo anterior es una demostración en C++ que se ejecuta en un equipo anfitrión; no usa hardware Arduino ni el objeto Serial de Arduino.
El redondeo antes de usar el mapeo es opcional: map() acepta argumentos enteros, así que redondear puede ser útil si primero conviertes una lectura de punto flotante a un entero, pero no es necesario en todas las tareas de mapeo. Consulta la función map() de Arduino para conocer su comportamiento con valores enteros.