Imagine que es el desarrollador responsable del diseño del tipo TimeSpan
. Tienes toda la funcionalidad básica en su lugar; todo parece estar funcionando bien. Entonces, un día algunos beta tester viene y se muestra este código:
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);
¿Por qué esa salida False
? el probador le pregunta. Aunque comprenda por qué sucedió esto (la pérdida de precisión al sumar x
y y
), debe admitir que parece un poco extraño desde la perspectiva del cliente. Luego se lanza en este caso de que:
x = 10.0;
y = 0.5;
t1 = TimeSpan.FromMilliseconds(x + y);
t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
que uno True
salidas! El probador es comprensiblemente escéptico.
En este punto usted tiene que tomar una decisión. Cualquiera puede permitir una operación aritmética entre TimeSpan
valores que se han construido a partir de double
valores para producir un resultado cuya precisión excede la exactitud del tipo double
sí -por ejemplo, 100000000000000.5 (16 cifras significativas) -o que puede, saber, no permitir eso.
Así que usted decide, usted sabe qué, lo haré de modo que cualquier método que use un double
para construir un TimeSpan
se redondeará al milisegundo más cercano. De esta manera, es documentado explícitamente que la conversión de double
a TimeSpan
es una operación con pérdida, absolviéndome en los casos en que un cliente ve un comportamiento extraño como este después de la conversión de double
a TimeSpan
y la esperanza de un resultado preciso.
No estoy necesariamente argumentando que esta es la decisión "correcta" aquí; claramente, este enfoque causa cierta confusión por sí mismo. Solo digo que se debe tomar una decisión de una manera u otra, y esto es lo que aparentemente se decidió.
Lamento ver desaparecer la respuesta anterior. Dudo que pudiera encontrar algo mejor (y quería +1 ...) – Peter
"[K] ahora, por qué este podría ser el caso, sería más fácil soportar el tiempo perdido". Considéralo un costo hundido. – jason
También lo mordieron. Mi teoría es que era un error en .net 1 y no se ha modificado porque rompería los programas existentes. La MS IMO debería al menos actualizar la descripción intellisense para indicar que estas funciones solo tienen una precisión de milisegundos. – CodesInChaos