Próbuję przekonwertować DateTime na datę Juliana i odwrócić ją w systemie Windows 7.
public static double ToJulianDate(this DateTime dt) {
return dt.ToOADate() + 2415018.5;
}
public static DateTime Julian2DT(this double julian) {
return DateTime.FromOADate(julian - 2415018.5);
}
Kiedy testuję te dwie funkcje, jak poniżej
var dt = DateTime.Now;
dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();
dt.ToJulianDate().Julian2DT().ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();
odwrócona data juliańska ma zawsze nieco inną wartość od oryginalnej wartości DateTime o setki mikrosekund.
Czy napisałem niepoprawny kod lub w systemie czasu Windows występuje niedokładność w mikrosekundach?
Odpowiedzi:
1 dla odpowiedzi № 1Jest to naturalny wynik faktu, że data juliańska jest reprezentowana jako double
, które zawsze będą miały ograniczoną dokładność. Na przykład bieżąca wartość wynosi około 2456348.78370906. To daje 7 cyfr znaczących przed przecinkiem - i a double
z dokładnością do „około” 15 miejsc po przecinku. Mamy więc około 8 cyfr dziesiętnych dokładności w części dziesiętnej ... co ma oznaczać dzień.
Teraz 1 dzień / 100000000 = 0,000864 sekundy. Spodziewam się więc, że dokładność będzie mniejsza niż milisekunda.
Jeśli ty don "t dodaj stałą dla daty juliańskiej, wszystko wyglądaraczej różaniec - w tym momencie bieżąca wartość wynosi tylko około 41330, więc w wartości jest więcej „miejsca” na precyzję pod względem pory dnia. Zasadniczo, im większe wartości zmiennoprzecinkowe, tym gorsza precyzja, w wartościach bezwzględnych (różnica między sąsiednimi wartościami staje się większa).