Arrotondamento per eccesso e per difetto

Il mio arduino sta misurando la temperatura e fornisce valori come: 28,58 gradi Celsius. Vorrei arrotondare per eccesso a un decimale. Potrei accorciare la variabile tagliando “8”, il che avrebbe un valore di 28,5. Eppure questo sembra un po come barare in quanto matematico non è corretto. Qualcuno sa come arrotondare per eccesso / per difetto. Il che mostrerebbe la mia temperatura come 28.6.

Sono necessari ulteriori consigli. Sto inviando la tempatura da Serial al mio RPi che ha un codice Python in esecuzione. Suggeriresti di fare larrotondamento nel codice Arduino o nel codice Python.

Grazie in anticipo!

Commenti

  • Non ' sarebbe meglio arrotondare al più vicino piuttosto che arrotondare sistematicamente per eccesso.
  • Sì, mi piacerebbe poterlo arrotondare in modo matematico. 28,65 <, diventerà 28,6 e 28,65 ≥, diventerà 28,7
  • Quindi lascia che Serial.print() esegua larrotondamento, come per la risposta di @Jot '.
  • Personalmente, non arrotonderei finché i dati non sono sul Pi. Perché perdere la precisione quando ' non è necessario? E se, in un momento successivo, decidessi di dover fare più calcoli sui dati sul Pi? Python ha una funzione round () incorporata.

Risposta

Per quanto ne so, Serial.print (o println) esegue larrotondamento per eccesso e per difetto. Tutto quello che devi fare è prendere una variabile float e fare Serial.print( value, 1);

Senza parametri aggiuntivi, viene scelto il valore predefinito, che è di 2 cifre decimali: Serial.print( value, 2);

Perché vuoi accorciare i byte sul Seriale? Puoi anche inviare due cifre decimali ed elaborare il valore in Python.

Commenti

  • Questa è lultima parte della mia domanda; ) chiedendomi dove elaborare, in python sul mio Rpi o prima di inviarlo.
  • Qualsiasi arrotondamento dovrebbe essere fatto il più vicino possibile alloutput finale. Se la tua porta seriale è abbastanza veloce, invia 2 o 3 cifre e arrotonda quando il Pi sta emettendo i dati. Non ' vuoi basare i calcoli su valori arrotondati se puoi evitarlo, il che introduce la possibilità di errori. Detto questo ' è una completa perdita di tempo nellinvio di numeri casuali, se il sensore di temperatura ha un errore di +/- 1 grado, la prima cifra decimale può essere utile, qualsiasi cosa dopo sia insignificante.
  • Va bene daccordo! È più preciso elaborare nella fase finale, ma la precisione del sensore non è presente, quindi risparmierò larghezza di banda utilizzando Serial.print (value, 1);

Risposta

Puoi arrotondare in C moltiplicando per il significato, aggiungendo +0,5, arrotondando per difetto (è uguale a un numero intero) e diviso.

float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0); 

28.6 sarà:

float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6 

In Python è uguale (tranne che loperatore cast è int ( …)

Aggiornamento: per i numeri negativi +0,5 dovrebbe essere -0,5

Crediti per Edgar Bonet: utilizzo di lavori tondi sia per i numeri positivi che per quelli negativi:

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

Commenti

  • Questo arrotonderebbe -28.58 a -28.5.
  • @JohnnyMopp Ha aggiornato le mie risposte, grazie per il commento
  • Perché non solo float f_rounded = round(f * 10) / 10.0;? entrambi i casi positivi e negativi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *