Afrunding op og ned

Min arduino mister tempaturet og giver værdier som: 28.58 grader Celcius. Jeg vil gerne afrunde dette op til en decimal. Jeg kunne gøre variablen en kortere ved at skære “8” ud, som ville vise 28.5. Alligevel føles dette lidt som snyd, da det matematisk ikke er korrekt. Er der nogen, der ved, hvordan man afrunder op / ned. Hvilket viser min tempatur som 28.6.

Ekstra råd er nødvendige. Jeg sender tempaturet med Serial til min RPi, der kører en python-kode. Vil du foreslå at gøre afrundingen i Arduino-koden eller i Python-koden.

På forhånd tak!

Kommentarer

  • Ville det ikke være ' bedre at afrunde til nærmeste snarere end systematisk at afrunde.
  • Ja, jeg ville elske at kunne afrunde den på matematisk måde. 28.65 <, bliver 28,6 og 28,65 ≥, bliver 28,7
  • Så lad Serial.print() gøre afrundingen, som pr. @Jot ' s svar.
  • Personligt ville jeg ikke afrunde, før dataene er på Pi. Hvorfor mister præcision, når du ikke har brug for '? Hvad hvis du på et senere tidspunkt beslutter at du skal foretage flere beregninger af dataene på Pi? Python har en runde () funktion indbygget.

Svar

Så vidt jeg ved, afrunder Serial.print (eller println) op og ned. Alt hvad du skal gøre er at tage en floatvariabel og gøre Serial.print( value, 1);

Uden ekstra parameter vælges standard, som er 2 decimalcifre: Serial.print( value, 2);

Hvorfor vil du forkorte byte over Serial? Du kan lige så godt sende to decimalcifre og behandle værdien i Python.

Kommentarer

  • Det er, hvad den sidste del af mit spørgsmål handler om; ) undrer sig over, hvor man skal behandle, i python på min Rpi eller inden afsendelse.
  • Enhver afrunding skal udføres så tæt på den endelige output som muligt. Hvis din serielle port er hurtig nok, skal du sende 2 eller 3 cifre og runde, når Pi udsender dataene. Du ønsker ikke ' ikke at basere beregninger på afrundede værdier, hvis du kan hjælpe det, der introducerer muligheden for fejl. Når det er sagt, er det ' et komplet spild af tid ved at sende tilfældige tal. Hvis temperatursensoren har en fejl på +/- 1 grad, kan den første decimal være nyttig, alt efter det er meningsløs.
  • Okay aftalt! Det er mere præcist at behandle i sidste fase, men sensorens nøjagtighed er ikke der, så jeg sparer båndbredde ved at bruge Serial.print (værdi, 1);

Svar

Du kan afrunde i C ved at multiplicere for betydningen, tilføje +0,5, runde ned (svarer til casting til et heltal) 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 det lige (undtagen cast-operatoren er int ( …)

Opdatering: for negative tal +0,5 skal være -0,5

Credits for Edgar Bonet: brug af runde værker til både positive og negative tal:

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

Kommentarer

  • Dette ville afrunde -28.58 til -28.5.
  • @JohnnyMopp Opdateret mine svar, tak for kommentaren
  • Hvorfor ikke bare float f_rounded = round(f * 10) / 10.0;? Dette håndterer både de positive og de negative sager.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *