Auf- und Abrunden

Mein Arduino misst die Temperatur und gibt Werte wie: 28,58 Grad Celsius an. Ich möchte dies auf eine Dezimalstelle aufrunden. Ich könnte die Variable kürzer machen, indem ich die „8“ abschneide, die 28,5 anzeigen würde. Dies fühlt sich jedoch ein bisschen wie Betrug an, da es mathematisch nicht korrekt ist. Weiß jemand, wie man auf- / abrundet? Was meine Temperatur als 28.6 anzeigen würde.

Zusätzlicher Rat erforderlich. Ich sende die Temperatur per Serial an mein RPi, auf dem ein Python-Code ausgeführt wird. Würden Sie vorschlagen, die Rundung im Arduino-Code oder im Python-Code durchzuführen?

Vielen Dank im Voraus!

Kommentare

  • Wäre ' nicht so Es ist besser, auf am nächsten zu runden, als systematisch aufzurunden.
  • Ja, ich würde es gerne auf mathematische Weise runden können. 28,65 < wird zu 28,6 und 28,65 ≥ wird zu 28,7
  • Dann lassen Sie Serial.print() die Rundung als ausführen per @Jot ' s Antwort.
  • Persönlich würde ich nicht runden, bis die Daten auf dem Pi sind. Warum die Präzision verlieren, wenn Sie ' nicht müssen? Was ist, wenn Sie zu einem späteren Zeitpunkt entscheiden, dass Sie mehr Berechnungen für die Daten auf dem Pi durchführen müssen? Python verfügt über eine integrierte Funktion round () .

Antwort

Soweit ich weiß, rundet der Serial.print (oder println) auf und ab. Sie müssen lediglich eine Float-Variable nehmen und Serial.print( value, 1);

ausführen. Ohne zusätzlichen Parameter wird die Standardeinstellung mit 2 Dezimalstellen gewählt: Serial.print( value, 2);

Warum möchten Sie die Bytes über die Seriennummer verkürzen? Sie können genauso gut zwei Dezimalstellen senden und den Wert in Python verarbeiten.

Kommentare

  • Darum geht es im letzten Teil meiner Frage. ) Ich frage mich, wo ich es verarbeiten soll, in Python auf meinem RPI oder vor dem Senden.
  • Jede Rundung sollte so nahe wie möglich an der endgültigen Ausgabe erfolgen. Wenn Ihre serielle Schnittstelle schnell genug ist, senden Sie 2 oder 3 Ziffern und runden Sie, wenn der Pi die Daten ausgibt. Sie ' möchten Berechnungen nicht auf gerundeten Werten basieren, wenn Sie helfen können, da dies die Möglichkeit von Fehlern mit sich bringt. Das heißt, ' ist eine völlige Zeitverschwendung beim Senden von Zufallszahlen. Wenn der Temperatursensor einen Fehler von +/- 1 Grad aufweist, kann die erste Dezimalstelle nützlich sein bedeutungslos.
  • Okay, stimmte zu! Die Verarbeitung im Endstadium ist präziser, die Genauigkeit des Sensors ist jedoch nicht vorhanden. Daher spare ich Bandbreite, indem ich Serial.print (Wert 1) verwende.

Antwort

Sie können in C runden, indem Sie die Signifikanz multiplizieren, +0,5 addieren, abrunden (entspricht einer Umwandlung in eine Ganzzahl) und dividieren.

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

28.6 lautet:

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

In Python ist es gleich (außer der Cast-Operator ist int () …)

Update: Für negative Zahlen sollte +0,5 -0,5 sein.

Credits für Edgar Bonet: Verwenden runder Werke für positive und negative Zahlen:

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

Kommentare

  • Dies würde -28.58 auf .
  • @JohnnyMopp Meine Antworten wurden aktualisiert, danke für den Kommentar
  • Warum nicht einfach float f_rounded = round(f * 10) / 10.0;? sowohl die positiven als auch die negativen Fälle.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.