Autor |
Beitrag |
Kirk1701A
Beiträge: 126
Erhaltene Danke: 3
Linux, Ubuntu, Mac, IOS, Android (4.2.x - 9.x.x), Win Mob., Micro. DOS, Win 95, Win 98, Win 2000, Win ME, Win XP, Win Vista, Win 7, Win8.1, Win 10
C# (VS 2017 Community/Enterprise, VS 2019 Professional/Enterprise), VB (VBA), JavaScript
|
Verfasst: Mi 26.09.18 04:42
Jolan Tru,
ich programmiere gerade eine Klassenbibliothek (soll später als nuget veröffentlicht werden), die Sternzeiten nach StarTrek TOS und TNG berechnen kann. Dazu brauche ich natürlich die Informationen des jeweiligen Datums.
Das Problem besteht darin, dass ich die Stunde des Tages durch 24 teilen muss und die Minute der Stunde durch 1440 teilen muss. Das muss ich komplett aufsplitten (die gesamte Rechnung meine ich damit), damit ein richtiges Ergebnis erreicht werden kann.
D.H.
C#-Quelltext 1: 2:
| double foo = Convert.ToDouble(DateTime.Now.Hour / 24); double foobar = Convert.ToDouble(DateTime.Now.Minute / 1440); |
Wenn man beim Debugging über das '/' hovert, kommt im Context das richtige Kommaergebnis.
Das ist ja alles gut und schön, nur, dieses Ergebnis wird nie und nimmer den Variablen (foo und foobar) zugewiesen. Das verstehe ich einfach nicht.
Danke für eure Hilfe
LLAP
Euer Kirk
P.S.
Ich habe schon so ziemlich alle Convertierungsmethodiken benutzt, aber keine hat geklappt.
_________________ "Ich war es und werde es immer bleiben... Ihr Freund!"
@Spock -> Star Trek II: Der Zorn des Khan
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 26.09.18 08:06
Die Minute-Eigenschaft eines DateTime hat einen Wert zwischen 0 und 59. Wenn Du das durch 1440 teilst, ist das, weil es eine Integer-Division ist, immer Null.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 26.09.18 08:07
Da du jeweils zwei Ganzzahlen dividierst, kommt als Ergebnis auch eine Ganzzahl heraus und diese Zahl wird dann erst in eine Fließkommazahl verwandelt.
Du brauchst auch die Convert-Methode nicht, es reicht, wenn eine der beiden Zahlen eine Fließkommazahl ist:
C#-Quelltext 1: 2:
| double foo = DateTime.Now.Hour / 24.0; double foobar = DateTime.Now.Minute / 1440.0; |
PS: Der Debugger (das Watch-Fenster bzw. Tooltip) benutzt bei Rechnungen stets Fließkommazahlen, da er die konkreten Datentypen nicht heranzieht.
|
|
Kirk1701A
Beiträge: 126
Erhaltene Danke: 3
Linux, Ubuntu, Mac, IOS, Android (4.2.x - 9.x.x), Win Mob., Micro. DOS, Win 95, Win 98, Win 2000, Win ME, Win XP, Win Vista, Win 7, Win8.1, Win 10
C# (VS 2017 Community/Enterprise, VS 2019 Professional/Enterprise), VB (VBA), JavaScript
|
Verfasst: Mi 26.09.18 19:18
Jolan Tru,
danke für eure Hilfe.
Leider hat das alles auch nicht funktioniert. Entweder erscheint kein Tooltip oder es wird (bei meiner aktuellen Rechnung (20/24=0,86666666666666666666666666666666...)) -304,257888... zugewiesen. Also ein total falsches Ergebnis.
Hinzu kommt, dass das Debugging einer Klassenbibliothek (natürlich mit angeschlossener Konsole) die totale Hölle ist.
Entweder will mein VS mich ärgern, oder ich bin unfähig meinen Beruf auszuüben, oder ich habe einen Fehler gemacht, den ich absolut nicht erkenne. Unter diesem Abschnitt seht Ihr die gesamte Methode, in der die Rechnung durchgeführt wird.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| private static double CalcTNGStardate(bool useCurrentDate) { double Stardate; double dayOfYear = DateTime.Now.DayOfYear; double hourOfDay = DateTime.Now.Hour; double minuteOfHour = DateTime.Now.Minute;
if (!useCurrentDate) { bool isLeapYear = CheckLeapYear(Year);
if (isLeapYear) { dayOfYear = DayOfMonth + (153 * Month - 157) / 5; Stardate = 1000 * (Year + 1 / 366 * (dayOfYear - 1 + HourOfDay / 24 + MinuteOfHour / 1440) - 2323); } else { dayOfYear = DayOfMonth + (153 * Month - 162) / 5; Stardate = 1000 * (Year + 1 / 365 * (dayOfYear - 1 + HourOfDay / 24 + MinuteOfHour / 1440) - 2323); } } else { Year = DateTime.Now.Year; bool isLeapYear = CheckLeapYear(Year);
if (isLeapYear) { Stardate = dayOfYear - 1 + (HourOfDay / 24) + (MinuteOfHour / 1440); Stardate = 366 * Stardate; Stardate = Year + (1 / Stardate); Stardate = (1000 * Stardate) - 2323;
} else { double foo = DateTime.Now.Hour / 24.0;
minuteOfHour = minuteOfHour / 1440.0;
Stardate = dayOfYear - 1 + hourOfDay + minuteOfHour; double booh = 365.0 * Stardate; Stardate = Year + 1.0 / booh - 2323.0; Stardate = 1000.0 * Stardate;
Console.WriteLine(Year); } }
return Stardate; } |
Ich danke euch jetzt schon für den moralischen Ar***tritt...
LLAP
Euer Kirk
_________________ "Ich war es und werde es immer bleiben... Ihr Freund!"
@Spock -> Star Trek II: Der Zorn des Khan
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 26.09.18 19:48
Hallo,
der Quelltext in der Form nutzt wahrscheinlich nicht viel, weil wir ja nicht so firm darin sind, die Sternzeit zu berechnen
Breche doch mal die problematischen Stellen in einfache, isolierte Rechnungen runter, bei denen man dann gucken kann, warum nicht das erwartete Ergebnis heraus kommt. Wichtig ist dabei immer, dass (1) ein überschaubarer Quelltext, (2) das erwartete Ergebnis und (3) das tatsächlich errechnete Ergebnis klar sind.
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Kirk1701A
Beiträge: 126
Erhaltene Danke: 3
Linux, Ubuntu, Mac, IOS, Android (4.2.x - 9.x.x), Win Mob., Micro. DOS, Win 95, Win 98, Win 2000, Win ME, Win XP, Win Vista, Win 7, Win8.1, Win 10
C# (VS 2017 Community/Enterprise, VS 2019 Professional/Enterprise), VB (VBA), JavaScript
|
Verfasst: Do 27.09.18 04:57
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| else { double foo = DateTime.Now.Hour / 24.0;
minuteOfHour = minuteOfHour / 1440.0;
Stardate = dayOfYear - 1 + hourOfDay + minuteOfHour; double booh = 365.0 * Stardate; Stardate = Year + 1.0 / booh - 2323.0; Stardate = 1000.0 * Stardate;
Console.WriteLine(Stardate); } |
Jolan Tru,
sorry, aber der jetzt hier gezeigte Ausschnitt hat genau das gemacht (Rechnungen gesplittet, usw.). Es geht mir hauptsächlich um die Variable 'foo', da diese ein total falsches Ergebnis errechnet bekommt:
C#-Quelltext 1:
| double foo = DateTime.Now.Hour / 24.0; |
Hier kommt eine 3-stellige, negative Kommazahl mit mind. 12 Nachkommastellen. Das ist falsch.
LLAP
Euer Kirk
_________________ "Ich war es und werde es immer bleiben... Ihr Freund!"
@Spock -> Star Trek II: Der Zorn des Khan
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 27.09.18 06:24
Prüfst du das nur im Debugger oder lässt du dir den Wert in der Konsole anzeigen?
Mal abgesehen davon ist 20/24 = 0,8333..
Wenn du das nur im Debugger ansiehst, solltest du dir foo und evtl. Hour mal in der Konsole anzeigen lassen.
C# ist bei mir schon eine ganze Zeit her, aber vielleicht wird dort optimiert und eine Variable, die im folgenden Source nicht genutzt wird, enthält dann keine sinnvollen Daten, da es wegoptimiert wurde.
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 27.09.18 07:41
@jasocul:
Im Debug-Modus optimiert der Compiler nicht - sollte er zumindest nicht, das kann man einstellen.
@Kirk1701A:
jasocul hat ja schon geschrieben, dass die 0,866666666666666 (Edit: 0,833333333333333) das richtige Ergebnis sind, es ist eben Periode 6 3.
Wenn Du nur 0,86 0,83 haben willst, musst Du das selber erreichen, z.B. indem Du mit 100 multiplizierst und dann nach int castest.
Moderiert von Th69: Auch die anderen Schreibfehler überarbeitet.
Zuletzt bearbeitet von Palladin007 am Do 27.09.18 13:04, insgesamt 2-mal bearbeitet
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 27.09.18 09:10
Palladin007: Hast du dich von Kirk anstecken lassen?
20 / 24 = 0,8333...
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 27.09.18 13:02
... Verdammt
Ich hab's selber nochmal nachgerechnet und dann falsch abgeschrieben
Typisch Montag an einem Donnerstag
Danke für die Korrektur
|
|
Kirk1701A
Beiträge: 126
Erhaltene Danke: 3
Linux, Ubuntu, Mac, IOS, Android (4.2.x - 9.x.x), Win Mob., Micro. DOS, Win 95, Win 98, Win 2000, Win ME, Win XP, Win Vista, Win 7, Win8.1, Win 10
C# (VS 2017 Community/Enterprise, VS 2019 Professional/Enterprise), VB (VBA), JavaScript
|
Verfasst: Do 04.10.18 10:44
Hallo Leute,
ich habe das Problem nun gelöst. Es funktioniert fabelhaft; Dankeschön.
Die Klasse ist nun als Nuget unter dem Namen "StarDateCalc" zum freien Download verfügbar. Besitzt keinerlei Abhängigkeiten und ist die genaueste Sternzeitberechnung für TOS und TNG, die jemals veröffentlicht wurde.
LLAP
Euer Kirk
_________________ "Ich war es und werde es immer bleiben... Ihr Freund!"
@Spock -> Star Trek II: Der Zorn des Khan
|
|
|