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
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.
Serial.print()
să rotunjească, ca după răspunsul @Jot '.