Arduino redondea al 0.5 más cercano

Tengo un valor doble, por ejemplo: 34.26 o 11.92 o 2.51. Debe redondearse al 0.5 más cercano, por lo que 1.34 -> 1.50 y 32.78 -> 33 y 21.09 -> 21.00

¿Cómo se hace esto?

Comentarios

  • Yo ' sugiero que ni siquiera uses flotadores. 0.5 = 50, 1.34 = 134, 32.78 = 3278, debería hacer que los cálculos sean más rápidos / eficientes.
  • Además, digamos ' s que tienes 134, puede hacer 134% 50, que devolverá 34 y luego puede verificar si ' s por encima de 24 (por debajo = redondeado a 0) y por encima de 74 (por debajo es redondeado a 50) y de lo contrario, redondea a 100.

Respuesta

Es una muy mala idea usar float.
Habiendo dicho eso. multiplique por 2 y haga una ronda estándar.
Luego, vuelva a dividir por 2.

Por ejemplo:

1.34 *2 = 2.68 round(2.68) = 3 3 /2 = 1.5 

y

32.78 *2 = 65.56 round(65.56)= 66 66 /2 = 33 

Comentarios

  • Multiplicar por 2 es realmente muy inteligente. Ya sentí que una forma tan simple debería existen.
  • También se usa comúnmente para los 0.10 y 0.05 más cercanos en las cajas registradoras (usando 10, 20).

Responder

Hice un pequeño algoritmo a partir de lo primero que me vino a la mente. Estoy usando números enteros, ya que creo que funciona mejor como flotantes.

Por ejemplo, puede representar euros (con puntos flotantes) expresándolos en centavos.

unsigned int roundToFifty(unsigned int nonRound){ unsigned int rest = nonRound % 50; unsigned int fits = floor(nonRound / 50); unsigned int add = 0; if(rest >= 25){ if(rest >= 75){ add = 100 }else{ add = 50 } } return fits*50+add } 

De hecho, creo que el algoritmo es un poco extraño y que también podría existir algo más simple / más efectivo. Fue lo primero que me vino a la mente.

Respuesta

float i=1.5237475984328953; #include "math.h" void setup() { Serial.begin(9600); } void loop() { Serial.println(i,6); float price = i*1000; Serial.println(price,2); float roundNearest = roundf(i*1000) ; // x 100 for two decimal place roundNearest = roundNearest/1000; Serial.println(roundNearest,6); price = (roundNearest*1000); Serial.println(price,2); while(1){} } 

puedes usar roundf () como en este video Video de demostración

Deja una respuesta

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