...mal wieder RUNDEN

Moin,

Ich möchte Zahlen auf eine Nachkommastelle genau runden. Ich hab schon ne ganze Weile gesucht, aber leider nichts passendes gefunden. Die meisten Antworten beziehen sich leider nur auf die Ausgabe der Zahlen, aber nicht wirklich aufs Runden.

Ich habe z.B. folgende "Zahlen" (....ich glaube es sind chars) vorliegen: 22.403 22.443 22.369 22.437 22.375 22.394

Die sollen alle auf eine Nachkommastelle gerundet werden (Die Zahlen können auch negativ werden, dann müssen es wohl floats werden?): 22.403 -> 22.4 22.443 -> 22.4 22.369 -> 22.4 22.437 -> 22.4 22.375 -> 22.4 22.394 -> 22.4

Danach möchte ich mit den Zahlen rechnen (muss also auch noch von char nach float umgewandelt werden denke ich).

Das ganze sind Temperaturen. Die interessieren mich nur auf eine Nachkommastelle. Es soll eine Funktion nur dann ausgeführt werden, wenn sich die Temperatur tatsächlich um mindestens 0.1°C ändert, jedoch nicht, wenn die Änderung kleiner als 0.1°C ist. Diese Logik habe ich bereits zusammengebaut. Leider fehlen mir noch die gerundeten Zahlen.

Danke und liebe Grüße, Chris

Du hast meine Kultur wirklich bereichert, vielen Dank!

Ich dachte eher sinngemäß an sowas wie

TempRounded = Round(Temp, 1)     // auf eine Nachkommastelle gerundet

....nur eben mit Arduino

Any wise idea?

Danke und liebe Grüße, Chris

Runden in floats ist nur beschränkt sinnvoll, da nicht alle Zahlen genau dargestellt werden können.

float eingang = 3.1456423;

void setup() {
  Serial.begin(250000);
  for (byte stellen = 0; stellen < 8; stellen++) {
    Serial.print(eingang, 7);
    Serial.print(F(" runden auf "));
    Serial.print(stellen);
    Serial.print(F(" Stellen "));
    Serial.print(runden(eingang, stellen), 7);
    Serial.print(F(" ergibt "));
    Serial.println(runden(eingang, stellen), stellen);
  }
}

float runden(float in, byte nachkomma) {
  float shift = 1;
  while (nachkomma--) {
    shift *= 10;
  }
  return floor(in * shift + .5) / shift;
}

void loop() {}
3.1456422 runden auf 0 Stellen 3.0000000 ergibt 3
3.1456422 runden auf 1 Stellen 3.0999999 ergibt 3.1
3.1456422 runden auf 2 Stellen 3.1500000 ergibt 3.15
3.1456422 runden auf 3 Stellen 3.1459999 ergibt 3.146
3.1456422 runden auf 4 Stellen 3.1456000 ergibt 3.1456
3.1456422 runden auf 5 Stellen 3.1456398 ergibt 3.14564
3.1456422 runden auf 6 Stellen 3.1456420 ergibt 3.145642
3.1456422 runden auf 7 Stellen 3.1456422 ergibt 3.1456422

Ich frage mich wozu das “Runden” gut sein soll.

Entweder komme ich mit ganzen Zahlen aus, dann benutze ich int oder long oder ich brauche gebrochene Zahlen (z.B. für Berechnungen).
Was bringt es mir einen Fließkommawert zu runden?

Gruß

Hannes

Entweder komme ich mit ganzen Zahlen aus, dann benutze ich int oder long oder

Nein, ich will ja nicht nur die ganzzahligen Temperaturwerte, sondern auch die Zehntel Grad Temperaturwerte.

oder ich brauche gebrochene Zahlen (z.B. für Berechnungen).
Was bringt es mir einen Fließkommawert zu runden?

Ganz einfach: Ich möchte eine Anzeige nur dann aktualisieren, wenn der neue Temperaturwert gegenüber dem alten Temperaturwert um mindestens 0,1°C unterschiedlich ist. Ich möchte ihn aber nicht aktualisieren, wenn der Unterschied kleiner als 0,1°C ist.
Also habe ich eine While Schleife, die nur gestartet wird, wenn der Wert T0 nicht mehr gleich oldT0 ist:

while (T0 != oldT0) {
   tft.setTextDatum(TR_DATUM);  // Text rechtsbündig ausrichten
   tft.setTextFont(4);
   tft.setTextSize(1);
   tft.setTextColor(TFT_BLACK);
   tft.drawFloat(oldT0, 1, 57, 55+0*26, 4);
   tft.setTextColor(textcol[0]); 
   tft.drawFloat(T0, 1, 57, 55+0*26, 4);
   oldT0=T0;
}

T0 und oldT0 sollen aber nur auf ein Zehntel Grad genau sein, damit die Schleife nicht bereits bei Unterschieden <0,1 gestartet wird.

Lieben Gruß,
Chris

themanfrommoon: Nein, ich will ja nicht nur die ganzzahligen Temperaturwerte, sondern auch die Zehntel Grad Temperaturwerte.

Was hat das mit ganzzahliger Berechnung zu tun?

Rechne einfach in 1/10 Grad, oder 1/100 Grad und zwar mit ganzen Anzahlen solcher Einheiten.

Rechne einfach in 1/10 Grad, oder 1/100 Grad und zwar mit ganzen Anzahlen solcher Einheiten.

Ich nix verstehen!?

Ich habe z.B. folgende "Zahlen" (....ich glaube es sind chars) vorliegen:

Wo kommen die her?

Wo kommen die her?

Aus einem JSON ausgelesen

themanfrommoon:
Ich nix verstehen!?

void setup() {
  Serial.begin(250000);
  for (int temperaturInZehntelGrad = 240; temperaturInZehntelGrad < 350; temperaturInZehntelGrad += random(6)) {
    printZehntel(temperaturInZehntelGrad);
    Serial.println();
  }
}
void printZehntel(int zehntel) {
  if (zehntel < 0) {
    Serial.write('-');
    zehntel = -zehntel;
  }
  Serial.print(zehntel / 10);
  Serial.write('.');
  Serial.print(zehntel % 10);
}

void loop() {}
24.0
24.1
24.2
24.7
24.9
25.3
25.5
25.5
25.7
26.2
26.3
26.3
26.8
26.8
27.0
27.3
27.8
27.9
28.0
28.4
28.8
29.1
29.2
29.5
30.0
30.4
30.7
31.0
31.0
31.2
31.3
31.4
31.6
31.8
31.9
32.1
32.4
32.5
32.6
32.9
33.2
33.3
33.5
33.6
33.6
34.1
34.6
34.8
34.9
34.9