2017-07-03 4 views
0

Les valeurs de date-heure avec microsecondes sont-elles converties en double avec une précision exacte?DateTime en microsecondes

Par exemple. J'ai date avec 3 Juillet 2017 10:00:00 00 Ticks 636346728000000050. qui a converti en double que j'obtiens comme 42919.4166666667. Comme de même, j'ai ajouté les 50 tiques à la date actuelle à savoir. 3 Juillet 2017 10:00:00 00 Ticks 636346728000000100 qui a converti en double, en obtenant également la même valeur double, mais la valeur de ticks a ajouté dans la date.

Je suis converti en deux par cette méthode date.ToOADate()

quelqu'un peut-il s'il vous plaît résoudre ce problème?

Merci à l'avance :)

+1

Il n'y a pas de "précision exacte" en temps de mesure. – vijoc

+0

Pourquoi le convertis-tu en double? – Magnus

+0

dans mon exigence, je l'ai converti en double pour certaines opérations. – Parthiban

Répondre

3

50 tiques ne peuvent être exprimées dans une date OLE Automation. Ce code:

DateTime d1 = DateTime.Parse("3 July 2017 10:00:00"); 
DateTime d2 = d1.AddTicks(100); 
double o2 = d2.ToOADate(); 
Console.WriteLine(o2); 

DateTime d3 = d1.AddTicks(1000); 
double o3 = d3.ToOADate(); 
Console.WriteLine(o3); 

DateTime d4 = d1.AddTicks(10000); 
double o4 = d4.ToOADate(); 
Console.WriteLine(o4); 

génère la sortie:

42919,4166666667 
42919,4166666667 
42919,4166666782 

si vous avez besoin au moins 10000 tiques pour l'ajout d'avoir un impact.

+0

Dans ma réponse, j'ai supposé que l'utilisation de ToOADate était une exigence. En relisant la question, je vois que la question ne dit pas explicitement, elle parle simplement de convertir un datetime en double. –

+0

Merci pour vos efforts. Oui. J'ai juste besoin de convertir le datetime en double. Comme vous l'avez dit, seulement 10 000 tiques (1 ms) ont un impact. Ma question est il y a un autre moyen de convertir en ajoutant des microsecondes date? – Parthiban

1

Il y a deux opérations logiques distinctes ici:

  • de tiques à Converting microsecondes. Il s'agit essentiellement de diviser par 10 (il y a 100 nanosecondes ou 0,1 microsecondes dans chaque tick), ce qui peut perdre des informations déjà en arithmétique entière - mais ajouter 50 ticks ajoute exactement 5 microsecondes, ce qui devrait être correct.

  • Conversion d'un nombre entier en nombre à virgule flottante. Votre valeur a 17 chiffres décimaux significatifs, ce qui correspond à l'extrémité supérieure de ce qu'un type à virgule flottante binaire 64 bits peut représenter. Vous ne devriez pas compter sur plus de 15 chiffres décimaux significatifs.

En plus de cela, vous utilisez ToOADate, qui semble avoir la milliseconde, regardant le reference source.

Alors:

  • Vous pouvez simplement diviser Ticks par 10 pour obtenir microsecondes, perdant seulement une petite quantité de précision
  • Vous pouvez convertir long-double d'une manière différente, qui perdrait moins d'informations que ToOADate mais vous allez toujours perdre des informations dans de nombreux cas.
  • Si vous divisez par 10.0 (évitant ainsi l'arithmétique entière pour commencer), alors en fonction de la valeur que vous essayez de représenter, vous pouvez éviter de perdre toute information.

Si vous êtes en mesure de choisir une autre époque pour votre valeur double, vous pouvez facilement exprimer microsecondes en valeurs avec une précision appropriée - mais vous auriez besoin de connaître la gamme de valeurs que vous avez besoin d'exprimer afin de vérifier Cela, tout en ayant le contrôle sur le reste du code en utilisant les double valeurs résultantes.