Warum Zeitspanne.FromSeconds(Doppel -) Runde auf Millisekunden?
TimeSpan.FromSeconds
nimmt eine Doppel -, und repräsentieren Werte bis hinab zu 100 Nanosekunden, bei dieser Methode ist jedoch unerklärlich, rundet die Zeit auf ganze Millisekunden.
Da habe ich gerade eine halbe Stunde damit verbracht zu lokalisieren, diese (dokumentiert!) Verhalten, wissen, warum dies der Fall ist würde es leichter machen, sich mit der Zeit verloren.
Kann jemand empfehlen, warum dies scheinbar kontraproduktiv Verhalten umgesetzt wird?
TimeSpan.FromSeconds(0.12345678).TotalSeconds
//0.123
TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond * 0.12345678)).TotalSeconds
//0.1234567
- Ich bin es Leid, zu sehen, dass die alte Antwort Weg. Ich bezweifle, ich könnte kommen mit etwas besser (und ich wollte auf +1...)
- "[K]nowing, warum dies der Fall ist würde es leichter machen, sich mit der verschwendeten Zeit." Betrachten Sie es als eine versunkene Kosten.
- Gebissen, durch das auch. Meine Theorie ist, dass es ein Fehler war, in .net 1 und wurde noch nicht geändert, weil es würde brechen vorhandenen Programme. IMO sollten die MS zumindest update der intellisense Beschreibung, um anzuzeigen, dass diese Funktion nur Millisekunden-Präzision.
- MS Bug-Eintrag: connect.microsoft.com/VisualStudio/feedback/details/653782/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie gefunden haben, aus sich selbst, es ist ein dokumentiertes feature. Es ist beschrieben in der Dokumentation von TimeSpan:
Der Grund für dies ist wahrscheinlich, weil ein doppelter ist nicht, dass genau alle. Es ist immer eine gute Idee, einige Runden beim Vergleich verdoppelt, denn es könnte nur ein sehr kleines bisschen größer oder kleiner, als man erwarten würde. Dieses Verhalten könnte tatsächlich bieten Sie mit einigen unerwarteten Nanosekunden, wenn Sie versuchen, in ganzen Millisekunden. Ich denke, das ist der Grund, warum Sie wählte, um Runde den Wert auf ganze Millisekunden und entsorgen Sie die kleinere stellen.
TimeSpan.FromTicks(TimeSpan.TicksPerSecond * YourSecondsDouble)
. 😉Auf die Rechte der Spekulation..
TimeSpan.MaxValue.TotalMilliseconds
ist Zeitstufen zu 922337203685477. Die Zahl hat 15 stellen.double
ist präzise bis zu 15 Ziffern.TimeSpan.FromSeconds
,TimeSpan.FromMinutes
etc. alle gehen durch die Konvertierung in Millisekunden, ausgedrückt indouble
(dann Zecken dannTimeSpan
die ist nicht interessant, jetzt)Also, wenn Sie erstellen
TimeSpan
, das in der NäheTimeSpan.MaxValue
(oderMinValue
) ist die Konvertierung präziser zu Millisekunden nur.Also die wahrscheinlich Antwort auf die Frage "warum" ist: die gleichen Präzision aller Zeiten.
Eine weitere Sache zu denken ist, ob der job noch besser gemacht werden könnte, wenn Konvertierungen durchgeführt wurden Erstens durch Umwandlung von Wert zu Zecken, ausgedrückt in
long
.Stell dir vor, du bist der Entwickler verantwortlich für die Erstellung der
TimeSpan
geben. Sie haben alle grundlegenden Funktionen vorhanden sind; es scheint alles zu funktionieren Super. Dann, eines Tages einige beta-tester kommt zusammen und zeigt Sie diesen code:Warum funktioniert die Ausgabe
False
? der tester fragt Sie. Obwohl Sie verstehen, warum dies passiert ist (Verlust der Präzision in additionx
undy
), Sie müssen zugeben, es tut scheinen ein bisschen seltsam aus der Perspektive eines Clients. Dann wirft er das ein an Sie:, Dass man Ausgänge
True
! Der tester ist verständlicherweise skeptisch.An diesem Punkt müssen Sie eine Entscheidung treffen. Sie können entweder ermöglichen eine arithmetische operation zwischen
TimeSpan
Werte, die gebaut wurden, vondouble
Werte ergeben ein Ergebnis , deren Präzision übersteigt die Genauigkeit derdouble
Typ selbst—z.B., 100000000000000.5 (16 bedeutende Persönlichkeiten)—oder Sie können, Sie wissen, nicht erlauben.So dass Sie entscheiden, wissen Sie was, ich werde einfach machen Sie es so, dass jede Methode, die verwendet eine
double
zu konstruierenTimeSpan
wird gerundet auf die nächste Millisekunde. So ist es explizit dokumentiert, dass eine Umstellung von einemdouble
zu einemTimeSpan
ist eine verlustbehaftete Betrieb, absolvierte Sie mir in Fällen, in denen ein client sieht komisch Verhalten, wie dies nach der Umstellungdouble
zuTimeSpan
und hoffen auf ein genaues Ergebnis.Ich bin ja nicht unbedingt argumentieren, dass dies die "richtige" Entscheidung zu treffen; dies hier ist klar, dieser Ansatz verursacht einige Verwirrung über seine eigenen. Ich sage nur, dass eine Entscheidung musste getroffen werden die eine oder andere Weise, und dies ist, was war offenbar entschieden.
Ich denke, die Erklärung ist da: TimeSpan-Struktur falsch verarbeitet, die Werte nahe, die min-und max-Wert
Und wie es aussieht ist es auch nicht ändern in absehbarer Zeit 🙂
FromSeconds verwendet private Methode Intervall
0x3e8 == 1000
Intervall-Methode multiplay Wert auf die const und dann cast zu lang (siehe Letzte Zeile):
Als Ergebnis haben wir die Präzision, mit 3 (x1000) Zeichen.
Verwenden Reflektor zu untersuchen