Imaginez que vous êtes le développeur responsable de la conception de l' TimeSpan
type. Vous avez toutes les fonctionnalités de base en place, tout semble fonctionner parfaitement. Puis un jour, des bêta-testeur arrive et vous montre ce code:
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);
Pourquoi est-ce que la sortie False
? le testeur vous la demande. Même si vous comprenez pourquoi c'est arrivé (la perte de précision en additionnant x
et y
), vous avez de l'admettre, il ne sembler un peu étrange, d'un point de vue du client. Puis il jette de celui-ci à vous:
x = 10.0;
y = 0.5;
t1 = TimeSpan.FromMilliseconds(x + y);
t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
Que l'une des sorties True
! Le testeur est naturellement sceptiques.
À ce stade, vous avez une décision à prendre. Soit vous pouvez vous permettre une opération arithmétique entre TimeSpan
valeurs qui ont été construits à partir de double
valeurs pour produire un résultat dont la précision dépasse la précision de l' double
type lui-même-par exemple, 100000000000000.5 (16 chiffres significatifs) ou vous pouvez, vous le savez, de ne pas permettre cela.
À vous de décider, vous savez quoi, je vais juste faire en sorte que toute méthode qui utilise un double
à la construction d'un TimeSpan
seront arrondis au millième de seconde. De cette façon, il est explicitement documentées que la conversion à partir d'un double
d'un TimeSpan
est une perte de fonctionnement, de le dispenser de moi dans le cas où un client voit le comportement bizarre comme cette après la conversion de double
de TimeSpan
et l'espoir d'un résultat précis.
Je ne suis pas nécessairement en soutenant que c'est la "bonne" décision ici; à l'évidence, cette approche provoque une certaine confusion sur son propre. Je dis juste qu'une décision devait être faite d'une façon ou l'autre, et c'est ce qui était apparemment décidé.