Avrundning upp och ner

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

  • Skulle det inte vara ' bättre att avrunda till närmast snarare än att systematiskt avrunda uppåt.
  • Ja, jag skulle gärna kunna avrunda det på matematisk väg. 28.65 <, blir 28,6 och 28,65 ≥, blir 28,7
  • Låt sedan Serial.print() göra avrundningen, som per @Jot ' s svar.
  • Personligen skulle jag inte runda förrän data är på Pi. Varför förlora precision när du inte behöver '? Vad händer om du vid ett senare tillfälle bestämmer att du behöver göra fler beräkningar på data på Pi? Python har en rund () funktion inbyggd.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *