Zum Inhalt springen

Integer in Float/Double umwandeln


The Incredible Fufialk

Empfohlene Beiträge

Hallo, sagt mal gibt es auch eine eine Funktion analog zu atof?

Ich habe Zeitstempel in Sekunden seit 1.1.1970 und will diese ins Windowsformat übertragen. Ganz simpel und einfach von Hand ausrechnen:

Der Code an der Stelle sieht so aus:

int timea;

float timestampa;

ofl.setf(ios::fixed);

ofl.setprecision(5)

timestampa = Tabi.timea / 86400 + 25569 + 3600;

Der erste Zeitstempel hat den int Wert 1'113'325'003

Das wäre das berechnete Ergebnis: 38453,95834

Ich erhalte aber: 42053.00000

Sieht jemand meinen Denkfehler?

Vielen Dank.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, da habe ich selber einen kleinen Fehler gemacht, und die 3600 vergessen zu addieren.

Mit Windowsformat meine ich, dass es zum Beispiel in Excel die Möglichkeit gibt, eine Spalte als Datum zu definieren. Stellt man dann die Ansicht um auf Standart bkommt man eine Zahl die ungefähr so aussieht, wie ich sagte, also der heutige Tag 14:30 Uhr bekäme den Wert: 38457,6041666667

Das ganze nennt sich glaub ich Pivot Jahr Und berechnet sich aus der Zeit, die Seit dem 01.01.1900 0:00 Uhr vergangen ist.

Daher auch meine Formel, die ich an dieser Stelle mal berichtige.

(Tabi.timea + 3600) / 86400 + 25569

Tab.timea = Das Datum in Sekunden seit dem 1.1.1970

+ 3600 = Eine Stunde kommt dazu da wir Sommerzeit haben

/ 86400 = Sekunden pro Tag Das ergebnis sind also Tage...

+ 25569 = Am Ende kommen noch die Tage hinzu, zwischen dem 1.1.1900 und dem 1.1.1970 liegen.

Aber so weit wollte ich gar nicht gehen, sondern einfach wissen, wie ich die Nachkommastellen korrekt angezeigt bekomme.

Danke und schönes WE.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber so weit wollte ich gar nicht gehen, sondern einfach wissen, wie ich die Nachkommastellen korrekt angezeigt bekomme.

Ach so. Ganz einfach: setprecision zählt alle Stellen, nicht nur die Nachkommastellen. Bei einer Zahl >= 10000 siehst du also mit setprecision(5) keine Nachkommastellen.

Übrigens: Falls du MFC benutzen kannst, wäre COleDateTime vielleicht etwas für dich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber ich erhalte trotzdem keine Nachkommastellen, sonder immer nur ,00000.
Und das ist auch richtig so. Ich hab doch gerade erklärt, wieso. :confused:

setprecision "sieht" 5 Stellen vor dem Komma, als hört's da auf mit der Darstellung. Wenn du noch Nachkommastellen dazu willst, solltest du einen höheren Wert als 5 angeben.

Nur nochmal als Tipp:

time_t t = time(0);
COleDateTime odt(t);
DATE d = odt.m_dt;[/CODE]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaube da haben wir gerade aneinander vorbei geredet. Selbst wen ich setprecision auf zehn setze (für fünf Stellen vor und fünf Stellen hinter dem Komma), werden die Nachkommastellen nicht berechnet! Sondern als nullen angegeben.

Die Sache mit dem Datum ist ja ganz nett, aber für mich nicht interessant. Ich brauche das PivotJahr, da ich die Ergebnisse an MatLab übergebe, und dort schon alles darauf eingestellt ist. Das wäre dann doppelter Aufwand.

Link zu diesem Kommentar
Auf anderen Seiten teilen

setprecision "sieht" 5 Stellen vor dem Komma, als hört's da auf mit der Darstellung. Wenn du noch Nachkommastellen dazu willst, solltest du einen höheren Wert als 5 angeben.

Das ist leider nicht ganz richtig. Wenn man nämlich ios::fixed verwendet, was auf alle Fälle den Punkt anzeigt, steht setprecision für die Zahl der Stellen nach dem Komma.

Siehe:


#include <iostream.h>				// cin, cout

#include <conio.h>				// getch

#include <iomanip.h>				// setprecision


int main()

{

	int i = 1113325003;

	float E;


	E = (i+3600)/86400+25569;

	cout << "Datum in Pivot = " << setprecision(10) << fixed << E;

	getch();

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit double als Zwischenschritt klappt es. Vielen Dank.

Weißt Du, woher der Rundungsfehler resultiert?

Mit dem Taschenrechner bekomme ich : 38454,74772 = 12.04.2005 17:56:43

Mit dem Programm : 38454,74609 = 12.04.2005 17:54:22

Also eine Abweichung von 2 Minuten.


#include <iostream.h>			// cin, cout

#include <conio.h>				// getch

#include <iomanip.h>			// setprecision


int main()

{

	int i = 1113325003;

	double e;


	e = i;

	float E;


	E = (e+3600)/86400+25569;

	cout << "Datum in float = " << setprecision(5) << fixed << e;

	cout << "\nDatum in Pivot = " << setprecision(5) << fixed << E;

	getch();

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...