Arduino Dezimalzahl trennen nach punkt

Hallo zusammen

Um Daten zu übertragen muss ich zwingend eine Zahl in zwei Variablen aufteilen.

Beispiel:

123.456 soll zu a= 123 b= 456 werden

es kann aber auch 12.345 geben a= 12 b= 345

Ich denke das wird relativ einfach machbar sein, aber ich komm grad nicht auf die Lösung, kann mir jemand helfen?

Kein Problem. Zuerst machst du mal ne INT draus, die du in ner zweiten Variablen ablegst. also int a=wert; //Int hat keine Kommastellen, du hast also da nun alles was vorm Komma steht

Dann hast du den Teil vorm Komma schon mal drinstehen.

Nun ziehst du die INT von Wert ab:

float bHilf= wert-a; Dann brauchst du nur noch das Komma nach rechts rücken:

b= bHilf*1000;

Wenn du die Kommastellen vorher nicht genau weisst, kannst du zwischendurch noch prüfen, ob beim (*1000) noch immer Kommastellen vorhanden sind, dann musst du eben noch mal verzehnfachen oder so. Ich habs zwar, glaub ich, etwas wirr ausgedrückt, aber hoffe mal, du verstehst was ich meine.

in math.h gibt es dazu mit modf() auch eine fertige Funktion. Aber ich habe es mal ausprobiert und es klappt irgendwie nicht wie beschrieben. Selbst mit 2 Nachkommastellen gibt es da schon üble Rundungsfehler. So ungenau ist float eigentlich auch wieder nicht.

Runden ist immr so ne Sache- da gibts mehrere Möglichkeiten (mathematisch runden, und kaufmännich runden, glaub ich)- Rundungen werden immer ungenau.
Braucht man in dem Beispiel aber wirklich nicht, ich versuchs nochmal:

Zuerst mal den Teil vor dem Komma abschneiden, nehmen wir an, die beliebige Zahl heisse Wert und sei von mir aus 12.345
Also:

float wert=12.345

int vorKomma=wert; // damit hat vorKomma jetzt den Inhalt 12
//nun gucken wir, was übrig bleibt:

float hilfsZahl=wert-vorKomma; // das ergibt also 0.345

jetzt zählen wir mal die Kommastellen, indem wir einfach testen:

hilfsZahl=hilfsZahl*10; // somit haben wir das Komma ne Stelle nach rechts geschoben und schauen nun, ob da noch mehr kommt:

int testZahl=hilfsZahl; //erstmal wie oben, die Stelle vorm Komma abschneiden
if (testZahl<hilfsZahl)…//ab hier wissen wir, ob es noch mehr nach dem Komma gibt, wenn, dann fangen wir einfach weiter oben nochmal an und wiederholen das Ganze bis testZahl==hilfsZahl ist

Hab ich jetzt freestyle hier spontan getippt, aber ich denke, es ist nun klar wie es gehen sollte.
Der Test sollte natürlich in ne Schleife gepackt werden, auch klar- und am Ende haben wir hübsch zwei INT`s…

Danke! Du hast mir die Lösung gebracht. Da ich die zahl eh zuerst teilen muss (von cm zu m) weis ich ja den Multiplikator, somit müsste das eigentlich immer passen ohne die Prüfung!

Rabenauge: Runden ist immr so ne Sache- da gibts mehrere Möglichkeiten (mathematisch runden, und kaufmännich runden, glaub ich)- Rundungen werden immer ungenau.

Er soll ja nicht runden. Das ist keine Rundungs-Funktion! modf() soll laut Beschreibung genau das machen was du da per Hand erklärt hast. Aber irgendwie kommt der gebrochene Anteil nicht richtig raus was ich so auf die schnelle probiert habe.

http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html#ga85861fee92c0904e9bb7a9875ee77579

okay irgend wie klappt es doch nicht ganz

Folgende Anforderungen stellt das Protokoll für welches ich die Daten bereitstelle: GPS Longitude: ID 0x02 = dddmm.mmmm (alles vor dem Punkt) ID 0x20 = dddmm.mmmm (alles nach dem Punkt.

475427424 sollte also werden: 4754 27424

Mein Code: float temp = Lattitude / 100000 ; Send(abs(temp)) ; // das passt temp = (temp - abs(temp)) * 100000 ; Send(abs(temp)) ; // die ersten stellen stimmen danach passts nicht mehr...

Ist float zu ungenau? Was habe ich sonst für möglichkeiten ?

float ist "zu ungenau", bzw. nicht geeignet. float hat ca. 6 Dezimalziffern Genauigkeit, long geht bis 2147483647 was gerade so reicht ;) Warum nimmst du nicht long ?

long lat = 475427424;
long ddmm = lat / 100000;  // ergibt 4754
long sub = lat - ddmm*100000;  // ergibt 27424

Das mit dem Vorzeichen hab ich mir jetzt gespart ;)