Hallo,
ich habe ein Problem, an dem ich mir die Zähne ausbeiße und nicht weiterkomme.
Folgendes: In einem Menue soll ein float wert mit 4 Nachkommastellen eingegeben werden können, und zwar so, dass die einzelne stelle mit dem Taster hochgezählt werden kann.
Das funktioniert auch alles, aber bei der letzten Stelle verrechnet er sich immer wieder.
Ich konnte den kritischen Teil in einen extra sketch extrahieren, der das selbe Fehlverhalten zeigt:
double _Wert = 0.0007;
void setup(){
Serial.begin(57600);
}
void loop(){
byte _Fliess_0001= long(_Wert *10000.0) % 10; // die vierte Nachkommastelle wird separiert als Byte.
Serial.print("Anfangs-Wert: ");Serial.println(_Wert,8);
Serial.print("4. Nachkommastelle separiert: ");Serial.print(_Fliess_0001);Serial.println();
// wieder zu einer double Zahl zusammenfügen
_Wert = _Fliess_0001 * 0.0001;
double a = _Wert *10000.0; // eine Kontrollrechnung fürs debuggen, um den Fehler zu finden.
Serial.print(" neuer Wert ");Serial.println(_Wert,8);
Serial.println(" Kontrollrechnung: ");Serial.print(_Wert,8);Serial.print(" * 10000: ");Serial.print(a,8);
Serial.println();Serial.println();
delay(2000);
}
Was passiert?
Ausgabe auf dem Display:
Anfangs-Wert: 0.00070000
4. Nachkommastelle separiert: 6
neuer Wert 0.00060000
Die "7" wird gewandelt in eine "6"!
Die Kontrollrechnung bringt es an den Tag:
Kontrollrechnung:
0.00060000 * 10000: 5.99999952
die 5.999999 wird beim Wandeln in integer gewandelt in 5.
Kann mir jemand sagen, wie ich das weg kriege? ein Runden mit float auf die 4.Nachkommastelle wäre eine Option, aber einfach überzogen!
Grüße
Gunther
edit: Arduino UNO