Представьте, что вы являетесь разработчиком, отвечающим за проектирование типа 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
типа -eg, 100000000000000.5 (16 значащих цифр) -ила вы можете, вы есть, нет это можно сделать.
Итак, вы решили, что знаете, что я сделаю так, чтобы любой метод, который использует double
для построения TimeSpan
, будет округлен до ближайшей миллисекунды. Таким образом, явно задокументировал, что преобразование с double
в TimeSpan
- операция с потерями, освобождающая меня в случаях, когда клиент видит странное поведение, подобное этому, после преобразования от double
до TimeSpan
и надеясь на точный результат.
Я не обязательно утверждаю, что это «правильное» решение здесь; Очевидно, что этот подход вызывает определенную путаницу. Я просто говорю, что решение нужно было сделать так или иначе, и это, по-видимому, было решено.
Простите, что старый ответ уходит. Я сомневаюсь, что я мог бы придумать что-нибудь получше (и я хотел бы это сделать +1) – Peter
«[K] учитывая, почему это может быть так, было бы легче мириться с потерянным временем». Подумайте, это утомительная стоимость. – jason
Убит от этого тоже. Моя теория заключается в том, что это была ошибка в .net 1 и не была изменена, поскольку она нарушила существующие программы. IMO MS должна хотя бы обновить описание intellisense, указав, что эти функции имеют только миллисекундную точность. – CodesInChaos