Unterschiedliche Nachkommazahlen in C?
Hallo Leute,
ich sitze gerade etwas verzweifelt am Computer.
Das Problem: Ich habe eine CSV Datei in C eingelesen mit unterschiedlich großen Fließkommazahlen (soll in dem Fall heißen, dass die Zahlen unterschiedlich viele Nachkommastellen haben - z.B. 10,12 und 1,2356).
In der Ausgabe sind diese Zahlen aber immer auf sechs Nachkommastellen beschränkt (ich verwende den Datentyp "double").
Gibt es eine Möglichkeit immer genau die Zahl auszugeben, die in der CSV-Datei gespeichert ist.
Also wenn 10,12 in der CSV-Datei "steht", dann soll auch 10,12 ausgegeben werden. Selbiges gilt für 1,2356; hier soll dann 1,2356 ausgegeben werden.
Ich bedanke mich jetzt schon für eine Rückmeldung!
1 Antwort
Bei der Umwandlung in Fließkomma Typ double geht diese Information verloren, es ist also so nicht möglich.
Man weiß bei "double", definitiv nicht, ob da mal 0.1700 oder 0.17 stand.
Man müsste also entweder die Anzahl der angegebenen Nachkommastellen in einem int-Wert zusätzlich speichern oder die ganze Zahl als String speichern.
Liest du die CSV-Datei mit einer Library ein, oder "von Hand" ? Parsen ist ja oft eine größere Aufgabe...
Wo soll die Information über die Anzahl der ausgewiesenen Nachkommastellen in einem Fließkommawert gespeichert sein ? Nirgendwo ! Es ist ein reiner numerischer Datentyp. 5,100 und 5,1 sind derselbe Wert, aber sollen vermutlich unterschiedliche Meßgenauigkeiten angeben.
Man müsste also entweder die Anzahl der angegebenen Nachkommastellen in einem int-Wert zusätzlich speichern oder die ganze Zahl als String speichern.
Oder eben eine Form von BCD nutzen, was je nach Weiternutzung sowieso sinnvoll wäre - oder alternativ etwas aus dem BEreich arbitrary precision, wo diese Information auch mitgepflegt wird.
Ja, eine Datenklasse, die "alles notwendige speichert", und auch die Parsing und Format-Funktionen enthält, wäre m.E. auch der übersichtlichste Ansatz, sogar bei kleineren Projekten. Vermutlich gibt es solche Lösungen bereits.
Falls es nur um Einlesen und Ausgeben geht, ohne Weiterverarbeitung, kann man sich natürlich auch mit simplen Strings behelfen.
Beim Parsen von CSV-Files, die von einer Tabellenkalkulation ausgegeben werden, sollte man auch darauf achten, dass Texte in Hochkommata stehen und Escape-Charaktere enthalten können.
Daher wäre eine simple "Split"-Funktion mit Trennzeichen ";" gefährlich
Auch dieses Rad wurde selbstverständlich schon hundertmal gebaut
So richtig geht die Information ja nicht verloren. Es müssen einfach nur die trailing zeros nicht rausgeschrieben werden.