Immagina di essere lo sviluppatore responsabile della progettazione del tipo TimeSpan
. Hai tutte le funzionalità di base sul posto; tutto sembra funzionare alla grande. Poi un giorno un po 'di beta tester arriva e vi mostra questo codice:
double x = 100000000000000;
double y = 0.5;
TimeSpan t1 = TimeSpan.FromMilliseconds(x + y);
TimeSpan t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
Perché quell'uscita False
? il tester ti chiede. Anche se capisci perché questo è accaduto (la perdita di precisione nell'aggiungere insieme x
e), devi ammettere che lo sembra un po 'strano dal punto di vista del cliente. Poi si lancia questo a voi:
x = 10.0;
y = 0.5;
t1 = TimeSpan.FromMilliseconds(x + y);
t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
Che uno uscite True
! Il tester è comprensibilmente scettico.
A questo punto si deve prendere una decisione. O si può consentire un'operazione aritmetica tra TimeSpan
valori che sono stati costruiti da double
valori per produrre un risultato cui precisione supera la precisione del tipo double
stessa -eg, 100000000000000.5 (16 cifre significative) -o si può, sapere, non consentire quello.
Quindi si decide, sapete cosa, farò in modo che qualsiasi metodo che utilizza un double
per costruire un TimeSpan
sarà arrotondato al millisecondo più vicino. In questo modo, è documentata esplicitamente che la conversione da un double
ad un TimeSpan
è un'operazione lossy, mi assolvendo nei casi in cui un cliente vede un comportamento strano come questo dopo la conversione double
-TimeSpan
e sperando in un risultato preciso.
Non sto necessariamente sostenendo che questa è la "giusta" decisione qui; chiaramente, questo approccio provoca una certa confusione da solo. Sto solo dicendo che una decisione doveva essere presa in un modo o nell'altro, e questo è ciò che apparentemente è stato deciso.
fonte
2011-01-22 07:43:35
Mi dispiace vedere la vecchia risposta andare via. Dubito che potrei inventarmi qualcosa di meglio (e volevo farlo +1 ...) – Peter
"[K] considerando il motivo per cui questo potrebbe essere il caso renderebbe più facile sopportare il tempo perso". Consideralo un costo affondato. – jason
Anche morso da quello. La mia teoria è che si trattava di un bug in .net 1 e non è stato modificato perché avrebbe interrotto i programmi esistenti. IMO MS dovrebbe almeno aggiornare la descrizione intellisense per indicare che queste funzioni hanno solo millisecondi di precisione. – CodesInChaos