Afronden naar boven en naar beneden

Mijn Arduino meet de temperatuur en geeft waarden als: 28,58 graden Celcius. Ik zou dit willen afronden op één decimaal. Ik zou de variabele korter kunnen maken door de “8” af te snijden die 28.5 zou weergeven. Toch voelt dit een beetje als vals spelen omdat het wiskundig niet correct is. Weet iemand hoe hij naar boven / beneden moet afronden. Waarmee mijn temperatuur 28.6 zou zijn.

Extra advies nodig. Ik stuur de temperatuur per serieel naar mijn RPi waarop een python-code wordt uitgevoerd. Zou je willen voorstellen om de afronding in de Arduino-code of in de Python-code te doen.

Bij voorbaat dank!

Reacties

  • Zou het niet ' zijn beter af te ronden naar dichtstbijzijnde in plaats van systematisch naar boven af te ronden.
  • Ja, ik zou het graag op wiskundige wijze willen afronden. 28,65 <, wordt 28,6 en 28,65 ≥, wordt 28,7
  • Laat Serial.print() de afronding doen, zoals per @Jot ' s antwoord.
  • Persoonlijk zou ik niet afronden voordat de gegevens op de Pi staan. Waarom zou u precisie verliezen als u dit niet ' niet nodig hebt? Wat als u op een later tijdstip besluit dat u meer berekeningen moet uitvoeren met de gegevens op de Pi? Python heeft een round () functie ingebouwd.

Answer

Voor zover ik weet, wordt de Serial.print (of println) naar boven en naar beneden afgerond. Het enige wat u hoeft te doen is een float-variabele nemen en Serial.print( value, 1);

doen Zonder extra parameter wordt de standaard gekozen, namelijk 2 decimale cijfers: Serial.print( value, 2);

Waarom wil je de bytes verkorten ten opzichte van de serieel? Je kunt net zo goed twee decimale cijfers sturen en de waarde in Python verwerken.

Opmerkingen

  • Daar gaat het laatste deel van mijn vraag over; ) me afvragen waar te verwerken, in python op mijn Rpi of voor verzending.
  • Elke afronding moet zo dicht mogelijk bij de uiteindelijke uitvoer worden gedaan. Als uw seriële poort snel genoeg is, stuur dan 2 of 3 cijfers en rond wanneer de Pi de gegevens uitvoert. U wilt geen ' berekeningen baseren op afgeronde waarden als u er iets aan kunt doen, dat introduceert de mogelijkheid van fouten. Dat gezegd hebbende, het ' is een complete verspilling van tijd met het verzenden van willekeurige getallen. Als de temperatuursensor een fout van +/- 1 graad heeft, kan de eerste decimaal nuttig zijn, alles daarna is zinloos.
  • Oké, akkoord! Het is nauwkeuriger om in de laatste fase te verwerken, maar de nauwkeurigheid van de sensor is er niet, dus ik zal bandbreedte besparen door Serial.print (waarde, 1) te gebruiken;

Antwoord

Je kunt in C afronden door te vermenigvuldigen voor de significantie, +0,5 toe te voegen, naar beneden af te ronden (gelijk aan gieten naar een geheel getal) en te delen.

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

28.6 zal zijn:

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

In Python is het gelijk (behalve dat de cast-operator int ( …)

Update: voor negatieve getallen +0.5 moet -0.5 zijn

Credits voor Edgar Bonet: ronde werken gebruiken voor zowel positieve als negatieve getallen:

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

Reacties

  • Dit zou -28.58 afronden naar -28.5.
  • @JohnnyMopp Mijn antwoorden bijgewerkt, bedankt voor de opmerking
  • Waarom niet gewoon float f_rounded = round(f * 10) / 10.0;? zowel de positieve als de negatieve gevallen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *