2013-02-25 2 views
1

Je suis en train de convertir DateTime à ce jour Julian et arrière sous Windows 7.fenêtres microsecondes de précision de calcul

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); 
    } 

Lorsque je teste ces deux fonctions comme ci-dessous

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(); 

la date Julian inversée a toujours une valeur légèrement différente de la valeur DateTime d'origine par des centaines de microsecondes.

Ai-je écrire un code erroné ou il y a quelques inexactitudes microsecondes dans les fenêtres système de temps?

Répondre

1

Il est un résultat naturel du fait que la date Julian est représentée comme double, qui aura toujours une précision limitée. Par exemple, la valeur actuelle est d'environ 2456348.78370906. Cela donne 7 chiffres significatifs avant la virgule décimale - et un double n'est précis qu'à "environ" 15 décimales. Donc, nous avons environ 8 chiffres décimaux de précision dans la partie décimale ... qui est censé représenter un jour.

maintenant 1 jour/100.000.000 = 0.000864 secondes. Je ne m'attendrais donc qu'à une précision d'un peu moins d'une milliseconde.

Si vous ne pas ajouter la constante pour une date Julian, les choses semblent plutôt Rosier - à ce moment-là la valeur actuelle est seulement d'environ 41330, donc il n'y a plus « chambre » à l'intérieur de la valeur de précision en termes de moment de la journée. Fondamentalement, plus les valeurs à virgule flottante sont grandes, plus la précision est faible, en termes absolus. (L'écart entre les valeurs adjacentes augmente.)

+0

Nous vous remercions de votre réponse. Une chose étrange est DateTime.FromOADate (dt.ToOADate()) est exactement la même chose avec dt.ToJulianDate(). Julian2DT() alors que différent de l'original dt. –

+0

DateTime.FromOADate (dt.ToOADate()) a également un problème de précision de microsecondes. –

Questions connexes