Laden...

C# Addiert falsch?

Erstellt von Grzfrz vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.213 Views
G
Grzfrz Themenstarter:in
48 Beiträge seit 2006
vor 17 Jahren
C# Addiert falsch?

Also, ich soll ein Programm schreiben (bzw ist das ein Teil eines Programms), das ein gregorianisches Datum in ein Julianisches umwandelt. z.B. der 14.1.2006, 16:30 muss zu 2453750,1875 werden. Aber bei JD kommt immer 2453750,25 raus..? Die Deb1,2,x Variablen habe ich zum Debuggen erstellt. In deb stehen die Zahlen, die bei den einzelnen Thermen von JD herauskommen sollten (und tatsächlich rauskommen). deb stimmt. Das Ergebniss von JD aber nicht g
Ich habe schon so ziemlich alles Probiert, das mir eingefallen ist (wie man an dex sieht)

deb = 2454845 + 428 + 14 + 0.6875 - 1524.5 - 13;
deb1 = System.Math.Truncate(30.6001 * (m + 1));
dex = (double)System.Math.Truncate((double)365.25 * ((double)y + (double)4716)) + (double)System.Math.Truncate((double)30.6001 * ((double)m + (double)1)) + (double)tt + (double)dd - (double)1524.5 + (double)B;
JD = System.Math.Truncate(365.25 * (y + 4716)) + System.Math.Truncate(30.6001 * (m + 1)) + tt + dd - 1524.5 + B;

Variablen:
double deb sowie deb1, debx, JD (steht für Julianisches Datum)
int y (Jahr, 2005)
int m (Monat, 13)
int tt (Tag, 14)
double dd (Gibt einen Tag in komma an, also 0,5 wäre 12:00; 0,6875)
int B (zur Korrektur, -13)

Ich hoffe, mir kann jemand von euch helfen, ich steh echt an.. Im Anhang habe ich mal das ganze Programm angehängt. Interessant ist davon nur die DateKonv Klasse, da steht das alles drinnen.

Wer super, wenn jemand bei diesem Problem helfen könnte 🙂 warscheinlich sehe ich nur den Wald vor Bäumen nicht?

_
227 Beiträge seit 2006
vor 17 Jahren

soweit ich weiß, musst du mit Zahlen vom typ decimal arbeiten um "genaue" werte zu er halten

6.862 Beiträge seit 2003
vor 17 Jahren

Erstmal könnt ich mir vorstellen das es dafür schon was fertiges in der DateTime Klasse gibt für dein Umrechnungsproblem, musst mal schaun.

Zu deinem eigentlichen Problem, das Problem liegt am Datentyp double, das ist ne Fließkommazahl und die ist nur endlich genau. Schau einfach mal bei Wikipedia wie Fließkommazahlen intern dargestellt werden.

Baka wa shinanakya naoranai.

Mein XING Profil.

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
diese Funktion liefert das gewüchte Ergebnis, und schlägt auch Daten vor der gregorianischen Kalederreform tot:

    double JulianDate(DateTime utc){
      double jdGregReform = 2299171.5;
      int y = utc.Year;
      int m = utc.Month;
      if (m <= 2)
      {
        y -= 1;
        m += 12;
      }
      int B = 2 + (int)(y / 400.0) - (int)(y / 100.0);
      double result = (int)(365.25 * y) + (int)(30.6001 * (m + 1)) + utc.Day + ((double)utc.Hour+(double)utc.Minute/60.0+(double)utc.Second/3600.0) / 24.0 + 1720994.5;
      if (result > jdGregReform)
      {
        result += B;
      }
      return result;
    }

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

6.862 Beiträge seit 2003
vor 17 Jahren

Auch wenn ich mich wiederhole, da gibts fertige Funktionen für im Framework, sogar für Kalender von denen ich noch nie was gehört hab 😉 Oder kennt einer von euch den Hijri Kalender? Im Namespace System.Globalization gibts die verschiedensten Kalender die man nutzen kann. Man erstellt einfach nen DateTime im Gregorianischen Kalender und kann dann der Julianischen Kalender das übergeben und dann das Julianische Datum abfragen.

Baka wa shinanakya naoranai.

Mein XING Profil.

3.170 Beiträge seit 2006
vor 17 Jahren

@talla
den julianischen Kalender aus dem Framework habe ich schon mal ausprobiert -> für meine Zwecke war er jedenfalls ungeeignet. Ich glaube er funktionierte nicht weit genug in die Vergangenheit, wenn ich mich richtig erinnere... und ob man damit von einem Format ins andere konvertieren kann, weiß ich auch nicht: Ich glaub da gabs irgendwie Probleme, man konnte jedenfalls nicht einem Datum einfach einen anderen Kalendertypen zuweisen und dann von einem richtigen Ergebnis ausgehen.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

G
Grzfrz Themenstarter:in
48 Beiträge seit 2006
vor 17 Jahren

Danke euch, mit Dezimal-Typen gehts perfekt 🙂

@MarsStein: Die DateTime sachen habe ich bis jetzt noch nicht ganz verstanden, aber ich glaube mit deinem Codebeispiel hast du mir auch gleichzeitig das erklährt ^^ THX!

Edit: Doch nicht verstanden 😉
Wie würdet ihr z.B. das ergebniss der Umkehrfunktion abspeichern, also ein greg. Datum mit Tagen, Monaten etc. Ich habe dazu Momentan ein Array genutzt, aber für so Datumssachen gibts doch sicher etwas eleganteres?

C
17 Beiträge seit 2006
vor 17 Jahren

Original von talla
Auch wenn ich mich wiederhole, da gibts fertige Funktionen für im Framework, sogar für Kalender von denen ich noch nie was gehört hab 😉 Oder kennt einer von euch den Hijri Kalender? Im Namespace System.Globalization gibts die verschiedensten Kalender die man nutzen kann. Man erstellt einfach nen DateTime im Gregorianischen Kalender und kann dann der Julianischen Kalender das übergeben und dann das Julianische Datum abfragen.

Ich bin mir jetzt nicht ganz sicher, aber ich habe den Verdacht, dass du hier etwas durcheinader bringst... Der Julianische Kalender und das Julianische Datum sind nicht das Selbe. Grzfrz sucht das Julianische Datum ("der 14.1.2006, 16:30 muss zu 2453750,1875 werden"), die Klasse System.Globalization.JulianCalendar berechnet den Julianischen Kalender.

Hitsch

There's never enough time to do all the nothing you want. (Calvin and Hobbes)

6.862 Beiträge seit 2003
vor 17 Jahren

Original von chritsch
Ich bin mir jetzt nicht ganz sicher, aber ich habe den Verdacht, dass du hier etwas durcheinader bringst... Der
>
und das
>
sind nicht das Selbe.

Ohoh 🙁 Bekenne mich schuldig...

Baka wa shinanakya naoranai.

Mein XING Profil.