Nachkommastellen begrenzen und Wert vergleichen

Ich möchte für eine Ausgabe auf dem LCD einen Wert auf eine Nachkommastelle begrenzen.
Damit der nachfolgende Text nicht verschoben wird, wenn sich die Zehnerstelle erhöht, gebe ich ein Leerzeichen aus wenn der Wert <10 ist.
Ich habe aber das Problem, dass Werte bis 10.04 als < 10 erkannt werden.
Bei serieller Ausgabe ist das Verhalten gleich:

void loop() {

  Wert = Wert + 0.01;
  if (Wert < 10) Serial.print(" ");
  Serial.print(Wert,1);
}

9.9
9.9
9.9
9.9
9.9
9.9
9.9
10.0
10.0
10.0
10.0
10.0
10.0
10.0
10.0
10.0
10.0
10.1
10.1

Ohne Begrenzung auf 1 Nachkommastelle funktioniert es:

void loop() {

  Wert = Wert + 0.01;
  if (Wert < 10) Serial.print(" ");
  Serial.println(Wert);
}

9.95
9.96
9.97
9.98
9.99
10.00
10.01
10.02
10.03

Mittlerweile habe ich schon sehr viele Varianten probiert (<10.05, <10.00, usw.). Aber es ändert nichts.
Hat jemand eine Idee woran das liegt?

Dein Code Schnippsel ist auch nicht korrekt, da fehlt schon einmal mindestens eine ‘(’. Desweiteren sehe ich hier auch keine Variablendeklartionen und vermutlich wieder einmal einen unnötigen Einsatz von floats.

Ansonsten könnte

if(Wert < 10.0)

abhilfe schaffen

Du hast ein Problem mit der internen Repräsentation von Floats und dem automatischem Runden in print().

Bau dir ein eigenes float2str()
Oder versuchs mal mit sprintf() ← platform.txt muss dazu angepasst werden.

Sinnvoller wäre es bei der ganzen Sache vermutlich, auf floats gänzlich zu verzichten. Fressen auf einem 8Bitter unnötig Speicher. Wie sieht deine Berechnung fürs float aus?

Bau dir ein eigenes float2str()
Oder versuchs mal mit sprintf() ← platform.txt muss dazu angepasst werden.

Oder nimm die extra dafür erfundene avr Ergänzung dtostrf

sschultewolter:
Dein Code Schnippsel ist auch nicht korrekt, da fehlt schon einmal mindestens eine ‘(’. Desweiteren sehe ich hier auch keine Variablendeklartionen und vermutlich wieder einmal einen unnötigen Einsatz von floats.

Ansonsten könnte

if(Wert < 10.0)

abhilfe schaffen

Stimmt, die Klammer habe ich jetzt oben eingefügt. Das war ein Kopierfehler.

Hier der vollständige Code:

float Wert = 9;       

void setup() {
  Serial.begin(9600);
}


// Main Loop
void loop() {

  Wert = Wert + 0.01;
  if (Wert < 10.0) Serial.print(" ");
  Serial.println(Wert,1);
}

Jetzt auch schon mit “if (Wert < 10.0)” probiert, mit dem gleichen Ergebnis.
In der Endanwendung ist float notwendig, weil mit Nachkommastellen gerechnet werden muss.

Mit wieviel Nachkommenstellen muss gerechnet werden? Bei 2 oder 3 Nachkommastellen würde ich darauf verzichten und den Wert entsprechend mit 10^n multiplizieren.

Alternativ teste mal

// Main Loop
void loop() {
	
	Wert = Wert + 0.01;
	if ((int)Wert < 10) Serial.print(" ");
	Serial.println(Wert,1);
}

Ansonsten den Vorschlag von Michael nutzen.

Sicher könnte man float umgehen. Allerdings wird der Wert aus vielen float Werten berechnet, welche ebenfalls am Display angezeigt werden sollen.
Ich könnte natürlich alles ganzzahlig rechnen, muss aber dann für die Darstellung am Display mehr Aufwand treiben.
Die ganzen anderen Werte haben 2 Nachkommastellen und die machen bei der Darstellung am Display dann auch kein Problem.

Mit “((int)Wert < 10)” ändert es leider auch nichts.

Danke für die bisherigen Vorschläge.

Ich werde mir den Vorschlag von Michael jetzt genauer anschauen.

Vielen Dank für eure Hilfe. Mit der dtostrf funktion funktioniert es.
Wieder was gelernt.
Wobei es für mich trotzdem ein Rätsel bleibt wieso das nur auftritt wenn man die Nachkommastellen mit " Serial.print(Wert,1);" begrenzt.
Wenn man es einfach mit Serial.print(Wert); raus schreibt, funktioniert es. Es werden halt dann 2 Nachkommastellen angezeigt.

Wobei es für mich trotzdem ein Rätsel bleibt wieso das nur auftritt wenn man die Nachkommastellen mit " Serial.print(Wert,1);" begrenzt.Wenn man es einfach mit Serial.print(Wert); raus schreibt, …

…werden halt 2 Nachkommastellen angezeigt. Funktioniert aber auch nicht immer.

Da ist der Übergang von 4 Ziffern (9.99) auf 5 Ziffern (10.00) bei 9.995

Deinen Fehler siehst du also z.B. bei 9.997 : LCD braucht 5 Zeichen, obwohl (x < 10.0)

Fehler findet man viel leichter, wenn man sie absichtlich einbaut :wink:

O.K. du hast Recht. Ich bin einfach nie in den Bereich gekommen :slight_smile:

Wobei es für mich trotzdem ein Rätsel bleibt wieso das nur auftritt wenn man die Nachkommastellen mit " Serial.print(Wert,1);" begrenzt.

Die Print Klasse ist oft schön, aber auch limitiert. print(float) formatiert Nachkommastellen. Und nur das. Sie berücksichtigt nicht was vor dem Komma steht. Mit dtostrf() kannst du den gesamten String auf eine konstante Breite formatieren. Vorzeichen, Vorkommastellen und der Punkt werden dabei auch gezählt.

sprintf() macht das gleiche für Integer. Wobei man sowas für Integer auch leicht selbst schreiben kann. Hier hatte ich das mal für Integer gemacht:

In #8 darunter ist die Text Version