Представьте, что вы разработчик, ответственный за разработку типа TimeSpan
.У вас есть все основные функции на месте;кажется, все работает отлично.Затем однажды приходит бета-тестер и показывает вам этот код:
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);
Почему выдается False
? , который запрашивает тестер.Даже если вы понимаете, почему это произошло (потеря точности при суммировании x
и y
), вы должны признать, что кажется немного странным с точки зрения клиента.Затем он бросает это в вас:
x = 10.0;
y = 0.5;
t1 = TimeSpan.FromMilliseconds(x + y);
t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
Этот выводит True
! Тестер вполне скептически настроен.
На данный момент у вас есть решение:делать.Либо вы можете разрешить арифметическую операцию между TimeSpan
значениями, которые были построены из double
значений, чтобы получить результат , точность которого превышает точность самого типа double
-например, 100000000000000.5 (16 значащих цифр) - или вы можете, вы знаете, не разрешить это.
Итак, вы решите, знаете, что я просто сделаю так, чтобы любой методкоторый использует double
для построения TimeSpan
, будет округлено до ближайшей миллисекунды.Таким образом, явно задокументировано , что преобразование из double
в TimeSpan
является операцией с потерями, освобождая меня в тех случаях, когда клиент видит странное поведение, подобное этому, после преобразования из double
в TimeSpan
и надеясь на точный результат.
Я не обязательно утверждаю, что это «правильное» решение здесь;ясно, что этот подход сам по себе вызывает некоторую путаницу.Я просто говорю, что решение нужно было принять тем или иным способом, и именно это, по-видимому, было решено.