HOWTO · Arduino
So runden Sie einen Float in Arduino auf die nächste Ganzzahl
Erfahren Sie, wie Arduino round() Gleitkommawerte auf die nächste Ganzzahl rundet, wie sich positive und negative Werte genau in der Mitte verhalten und wie Sie auf eine gewählte Anzahl von Dezimalstellen runden.
Auf dieser Seite
Verwende die Arduino-Funktion round(), um aus einem float den nächstliegenden ganzzahligen Wert zu erhalten. Werte genau in der Mitte zwischen zwei ganzen Zahlen werden vom Nullpunkt weg gerundet: 5.5 wird zu 6 und -3.5 zu -4. Wenn ein ganzzahliger Wert benötigt wird, kann das Ergebnis in einer Variablen vom Typ int gespeichert werden.
Was round() in Arduino macht
round() gibt einen Gleitkommawert zurück, der dem nächstliegenden ganzzahligen Wert entspricht. Wird das Ergebnis einer Variablen vom Typ int zugewiesen, wird darin der ganzzahlige Wert gespeichert. Zum Beispiel ergibt round(3.6) den Wert 4, während round(-2.3) den Wert -2 ergibt. Die Funktion ändert den Wert, der in späteren Berechnungen verwendet wird; die ursprüngliche Variable bleibt unverändert, sofern du das Ergebnis nicht wieder ihr zuweist.
Dieses vollständige C++-Programm veranschaulicht das Runden auf ganze Zahlen und das Skalieren eines Messwerts auf zwei Nachkommastellen. Es verwendet die Standard-C++-Funktion round, die derselben Regel folgt. In einem Arduino-Sketch kannst du round() aufrufen und die Werte bei Bedarf über Serial ausgeben. Das Beispiel ist eigenständig und gibt beim Ausführen beschriftete Ergebnisse aus.
#include <cmath>
#include <cstdio>
int main() {
float positive = 5.5f;
float belowZero = -3.5f;
float measurement = 7.4567f;
int roundedPositive = static_cast<int>(std::round(positive));
int roundedBelowZero = static_cast<int>(std::round(belowZero));
float roundedMeasurement = std::round(measurement * 100.0f) / 100.0f;
std::printf("positive: %d\n", roundedPositive);
std::printf("below zero: %d\n", roundedBelowZero);
std::printf("measurement: %.2f\n", roundedMeasurement);
return 0;
}
Positive und negative Werte runden
Bei positiven Werten wird die nächstliegende ganze Zahl gewählt: Werte unterhalb der Mitte werden abgerundet, Werte ab der Mitte aufgerundet. Daher wird 5.4 zu 5, während 5.5 und 5.6 zu 6 werden. Bei einem exakten Halbwert wird vom Nullpunkt weg gerundet.
Für negative Werte gilt dieselbe Halbwertregel. Zum Beispiel wird -3.4 zu -3, während -3.5 und -3.6 zu -4 werden. Das ist keine Banker’s Rounding genannte Rundung: Halbwerte werden nicht in Richtung der geraden Zahl gerundet. Wenn du das Ergebnis einer Variablen vom Typ int zuweist, achte darauf, dass der gerundete Wert im Wertebereich dieses Typs liegt.
Auf eine bestimmte Anzahl von Nachkommastellen runden
round() rundet für sich genommen auf eine ganze Zahl. Um einen Wert auf eine bestimmte Anzahl von Nachkommastellen zu runden, multipliziere ihn mit der entsprechenden Zehnerpotenz, rufe round() auf und teile das Ergebnis anschließend wieder durch diesen Faktor. Für zwei Nachkommastellen ist der Faktor 100; so wird beispielsweise 7.4567 ungefähr zu 7.46.
Diese Skalierung eignet sich für viele Anzeige- und Berechnungszwecke. Werte vom Typ float werden jedoch mit begrenzter binärer Genauigkeit gespeichert. Ein Dezimalwert lässt sich daher möglicherweise nicht exakt darstellen; ein Wert nahe einem Halbwert kann sich deshalb anders verhalten als bei idealer Dezimalrechnung. Bewahre den ursprünglichen Wert für Berechnungen auf, die mehr Genauigkeit erfordern, und formatiere den Wert für die Anzeige, wenn du lediglich eine feste Anzahl sichtbarer Nachkommastellen benötigst. Auch durch die Skalierung wird der gespeicherte Wert nicht exakt; sie verändert das gerundete Ergebnis entsprechend der verfügbaren Genauigkeit.
Gerundete Werte in einem Arduino-Sketch verwenden
Weise das Ergebnis in einem Sketch dort zu, wo ein ganzzahliger Wert sinnvoll ist, etwa bei der Auswahl eines Array-Index oder bei der Anzeige eines ganzzahligen Messwerts. Prüfe vor der Zuweisung, ob der gerundete Wert im Wertebereich von int liegt. Für eine serielle Ausgabe gibt Serial.println(round(sensorValue)); den gerundeten Wert aus. Das vollständige Programm oben ist ein C++-Beispiel für den Host-Rechner und verwendet weder Arduino-Hardware noch das Arduino-Serial-Objekt.
Vor dem Zuordnen ist Runden optional: map() akzeptiert ganzzahlige Argumente. Runden kann hilfreich sein, wenn du einen Gleitkomma-Messwert zunächst in eine ganze Zahl umwandeln möchtest, ist aber nicht für jede Zuordnungsaufgabe erforderlich. Weitere Informationen zum Zuordnen ganzzahliger Werte findest du in der Beschreibung der Arduino-Funktion map().