Avrunding opp og ned

Arduinoen min måler temporen og gir verdier som: 28.58 grader Celcius. Jeg vil gjerne runde dette opp til en desimal. Jeg kunne gjøre variabelen en kortere ved å kutte «8» av som ville vise 28.5. Likevel føles dette litt som juks, da det ikke er matematisk riktig. Er det noen som vet hvordan de skal rundes opp / ned? Noe som viser temporen min som 28.6.

Ekstra råd som trengs. Jeg sender tempaturen med Serial til RPi-en min som har en python-kode som kjører. Vil du foreslå å gjøre avrundingen i Arduino-koden eller i Python-koden.

På forhånd takk!

Kommentarer

  • Ville ikke ' t være bedre å avrunde til nærmeste i stedet for å systematisk avrunde.
  • Ja, jeg vil gjerne kunne avrunde den på matematisk måte. 28.65 <, blir 28,6 og 28,65 ≥, blir 28,7
  • La Serial.print() gjøre avrundingen, som per @Jot ' s svar.
  • Personlig vil jeg ikke runde før dataene er på Pi. Hvorfor miste presisjon når du ikke trenger '? Hva om du på et senere tidspunkt bestemmer deg for at du må gjøre flere beregninger på dataene på Pi? Python har en round () -funksjon innebygd.

Svar

Så vidt jeg vet avrunder Serial.print (eller println) opp og ned. Alt du trenger å gjøre er å ta en flytvariabel og gjøre Serial.print( value, 1);

Uten ekstra parameter er standard valgt, som er 2 desimaltegn: Serial.print( value, 2);

Hvorfor vil du forkorte byte over Serial? Du kan like godt sende to desimaltegn og behandle verdien i Python.

Kommentarer

  • Det er det den siste delen av spørsmålet mitt handler om; ) lurer på hvor du skal behandle, i python på min Rpi eller før sending.
  • Enhver avrunding bør gjøres så nær den endelige utdata som mulig. Hvis den serielle porten din er rask nok, kan du sende to eller tre sifre og runde når Pi sender ut dataene. Du vil ikke ' ikke basere beregninger på avrundede verdier hvis du kan hjelpe det, som introduserer muligheten for feil. Når det er sagt ' er det fullstendig bortkastet tid å sende tilfeldige tall, hvis temperatursensoren har en feil på +/- 1 grad, kan den første desimalen være nyttig, alt etter det er meningsløs.
  • Ok, enig! Det er mer presist å behandle i sluttfasen, men sensorens nøyaktighet er ikke der, så jeg vil spare båndbredde ved å bruke Serial.print (verdi, 1);

Svar

Du kan runde i C ved å multiplisere for betydningen, legge til +0,5, runde ned (tilsvarer som avstøpning til et heltall) og dele.

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

28.6 vil være:

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

I Python er den lik (bortsett fra at castoperatøren er int ( …)

Oppdatering: for negative tall +0,5 skal være -0,5

Kreditt for Edgar Bonet: bruk av runde verk for både positive og negative tall:

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

Kommentarer

  • Dette ville runde -28.58 til -28.5.
  • @JohnnyMopp Oppdaterte svarene mine, takk for kommentaren
  • Hvorfor ikke bare float f_rounded = round(f * 10) / 10.0;? Dette håndterer både positive og negative tilfeller.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *