Arrotondare al più vicino 0.1

Ciao a tutti,
leggo da un sensore di temperature e ottengo un float a 2 decimali (p.e. 21.77). Voglio arrotondare al decimale più vicino.

Questo è il mio sketch


void setup() {
  Serial.begin(115200);
}

void loop() {
  float temperature = 21.81;
  float rounded_temperature = round(temperature * 10) / 10.0;
  Serial.print("21.81 ->");
  Serial.println(rounded_temperature);
  delay(1000);

temperature = 21.79;
  rounded_temperature = round(temperature * 10) / 10.0;
  Serial.print("21.79 ->");
  Serial.println(rounded_temperature);
  delay(1000);

temperature = 21.77;
  rounded_temperature = round(temperature * 10) / 10.0;
  Serial.print("21.77 ->");
  Serial.println(rounded_temperature);
  delay(1000);

temperature = 21.70;
  rounded_temperature = round(temperature * 10) / 10.0;
  Serial.print("21.70 ->");
  Serial.println(rounded_temperature);
  delay(1000);
}


E questo è l'output

21.81 ->21.85
21.79 ->21.75
21.77 ->21.75
21.70 ->21.75

Mentre l'output che vorrei è...

21.81 ->21.80

21.79 ->21.80
21.77 ->21.80
21.70 ->21.70

Grazie a tutti!

Con il tuo sketch senza alcuna modifica io ottengo esattamente l'output che desideri su un ATMega328... che MCU stai usando?

sineverba: ... ma vuoi la stampa con UN solo decimale ? ... basta che scrivi: Serial.println(rounded_temperature, 1); e ti stampa un solo decimale ... ::slight_smile:

Guglielmo

No, non voglio la stampa (la stampa è solo per aver l'output, in realtà invierò i dati tramite mqtt via mysensors) e si, sto usando un Atmega anche io (non un Arduino)

Dividi per 10 e poi moltiplichi x 10, dovrebbe funzionare

Anche a me il tuo codice funziona come ti aspetti.

Al limite prova a passare per un int...

  float temperature = 21.81;
  int temp = ((temperature * 100) + 5) / 10;
  float rounded_temperature = temp / 10.0;
  Serial.print("21.81 ->");
  Serial.println(rounded_temperature);
  delay(1000);

Se dall’altra parte può essere gestito, ti converrebbe trasmettere un int, che occupa solo 2 byte:
int r_temp_10x = temperature*10+0.521.81 produce 218, cioè 21.8;
21.85 produce 219, cioè 21.9.