Min arduino mäter tempaturen och ger värden som: 28.58 grader Celcius. Jag vill avrunda detta upp till en decimal. Jag kunde göra variabeln en kortare genom att klippa av ”8” som skulle visa 28.5. Ändå känns det lite som fusk eftersom det inte är matematiskt korrekt. Vet någon hur man rundar upp / ner. Vilket skulle visa min hastighet som 28.6.
Extra råd behövs. Jag skickar tempaturen med Serial till min RPi som har en pythonkod igång. Skulle du föreslå att göra avrundningen i Arduino-koden eller i Python-koden.
Tack på förhand!
Kommentarer
Svar
Så vitt jag vet gör Serial.print (eller println) avrundning upp och ner. Allt du behöver göra är att ta en flytvariabel och göra Serial.print( value, 1);
Utan extra parameter väljs standardvärdet, vilket är två decimaler: Serial.print( value, 2);
Varför vill du förkorta byte över Serial? Du kan lika gärna skicka två decimaler och bearbeta värdet i Python.
Kommentarer
- Det är vad den sista delen av min fråga handlar om; ) undrar var du ska bearbeta, i python på min Rpi eller innan du skickar.
- Alla avrundningar bör göras så nära den slutliga utdata som möjligt. Om din seriella port är snabb nog, skicka två eller tre siffror och runda när Pi skickar ut data. Du vill inte ' inte basera beräkningar på avrundade värden om du kan hjälpa till, vilket ger möjlighet till fel. Som sagt är det ' ett helt slöseri med att skicka slumpmässiga siffror, om temperaturgivaren har ett fel på +/- 1 grad kan den första decimalen vara användbar, allt efter det är meningslöst.
- Okej överens! Det är mer exakt att bearbeta i slutskedet, men sensorns noggrannhet finns inte, så jag kommer att spara bandbredd med Serial.print (värde, 1);
Svar
Du kan runda i C genom att multiplicera för betydelsen, lägga till +0,5, runda nedåt (lika med att casta till ett heltal) och dela.
float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0);
28.6 kommer att vara:
float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6
I Python är det lika (förutom att castoperatören är int ( …)
Uppdatering: för negativa tal +0,5 ska vara -0,5
Krediter för Edgar Bonet: använda runda verk för både positiva och negativa tal:
float f_rounded = round(f * 10) / 10.0;
Kommentarer
- Detta skulle avrunda
-28.58
till-28.5
. - @JohnnyMopp Uppdaterade mina svar, tack för kommentaren
- Varför inte bara
float f_rounded = round(f * 10) / 10.0;
? Detta hanterar både positiva och negativa fall.
Serial.print()
göra avrundningen, som per @Jot ' s svar.