Rotunjire în sus și în jos

Arduino-ul meu este în măsură să tempereze și oferă valori precum: 28,58 grade Celcius. Aș dori să rotunjim acest lucru cu o zecimală. Aș putea face variabila una mai scurtă prin tăierea „8”, care ar afișa 28.5. Cu toate acestea, acest lucru se simte un pic ca trișarea, deoarece nu este corect din punct de vedere matematic. Știe cineva cum să rotunjească în sus / în jos. Ceea ce ar arăta că temperatura mea este 28.6.

Sunt necesare sfaturi suplimentare. Trimit temperatura către Serial către RPi-ul meu, care are un cod python care rulează. Ați sugera să efectuați rotunjirea în codul Arduino sau în codul Python.

Vă mulțumim anticipat!

Comentarii

  • Nu ar fi ' mai bine să rotunjim la cel mai apropiat decât să rotunjim sistematic în sus.
  • Da, mi-ar plăcea să o putem rotunji în mod matematic. 28,65 <, va deveni 28,6 și 28,65 ≥, va deveni 28,7
  • Apoi lăsați Serial.print() să rotunjească, ca după răspunsul @Jot '.
  • Personal, nu aș rotunji până când datele nu sunt pe Pi. De ce să pierdeți precizia când nu aveți nevoie de '? Ce se întâmplă dacă, la un moment dat, decideți că trebuie să faceți mai multe calcule asupra datelor de pe Pi? Python are o funcție round () încorporată.

Răspuns

Din câte știu eu, Serial.print (sau println) se rotunjește în sus și în jos. Tot ce trebuie să faceți este să luați o variabilă float și să faceți Serial.print( value, 1);

Fără parametru suplimentar, se alege valoarea implicită, care este de 2 cifre zecimale: Serial.print( value, 2);

De ce doriți să scurtați octeții peste Serial? Puteți la fel de bine să trimiteți două cifre zecimale și să procesați valoarea în Python.

Comentarii

  • Despre asta este ultima parte a întrebării mele; ) mă întreb unde să procesez, în python pe Rpi sau înainte de a trimite.
  • Orice rotunjire trebuie făcută cât mai aproape de ieșirea finală posibil. Dacă portul dvs. serial este suficient de rapid, trimiteți 2 sau 3 cifre și rotunjiți când Pi transmite datele. Nu ' nu doriți să bazați calculele pe valori rotunjite dacă îl puteți ajuta, ceea ce introduce posibilitatea erorilor. Acestea fiind spuse, ' este o pierdere completă de timp trimitând numere aleatorii, dacă senzorul de temperatură are o eroare de +/- 1 grad, atunci prima zecimală poate fi utilă, orice după aceea este fără sens.
  • Bine de acord! Este mai precis să se proceseze în etapa finală, dar precizia senzorului nu există, așa că voi economisi lățimea de bandă utilizând Serial.print (valoare, 1);

Răspuns

Puteți rotunji în C înmulțind pentru semnificație, adăugând +0,5, rotunjit în jos (egal cu aruncarea la un întreg) și împărțiți.

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

28.6 va fi:

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

În Python este egal (cu excepția faptului că operatorul de distribuție este int ( …)

Actualizare: pentru numerele negative +0.5 ar trebui să fie -0.5

Credite pentru Edgar Bonet: folosirea lucrărilor rotunde atât pentru numerele pozitive, cât și pentru cele negative:

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

Comentarii

  • Aceasta ar rotunji -28.58 la -28.5.
  • @JohnnyMopp Mi-a actualizat răspunsurile, mulțumesc pentru comentariu
  • De ce nu doar float f_rounded = round(f * 10) / 10.0;? atât cazurile pozitive, cât și cele negative.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *