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
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.
Serial.print()
gøre afrundingen, som pr. @Jot ' s svar.