DateTime.Now.AddMilliseconds(1.5); // adds 2 milliseconds
Что же, спрашивается, они думали здесь? Это кажется мне страшно плохой практикой для создания метода, который берет двойное, если это не обрабатывает дробные значения. Почему они не реализовали это с вызовом к AddTicks и обработали часть правильно? Или, по крайней мере, возьмите интервал, таким образом, это очевидно для вызывающих сторон?
Я предполагаю, что должно быть серьезное основание, почему они реализовали его этот путь, но я не могу думать, каково это могло быть. Кто-либо может предложить понимание?
Править: только далее подчеркнуть мысль:
AddSeconds(1.5); // Adds 1500 milliseconds
Это компромисс, но не совсем необоснованный. Переданный аргумент должен округлить , чтобы иметь дело с разрешением DateTime. Округление с точностью до тика (100 наносекунд) является проблемой. Double не имеет достаточного количества значащих цифр, чтобы охватить весь диапазон возможных дат. 10000 лет x 365 x 24 x 3600 x 1000 x 10000 = 3E18, double имеет только 15 значащих цифр. Нет проблем с округлением до миллисекунды, 3E14 просто достаточно хорошо (каковы шансы?)
Решение простое, просто используйте AddTicks (1,5 * 10000).
Это действительно кажется довольно странным. Моя единственная мысль заключается в том, что, возможно, они посчитали, что лучше округлить до ближайшей миллисекунды, чем рисковать, что вызывающий абонент усекает double до int. Да, это довольно слабое объяснение. Извините.
Из MSDN :
Значение в миллисекундах округляется до ближайшего целого числа перед добавлением к указанному DateTime.
Поскольку DateTime
не может разрешить ничего, меньшее, чем миллисекунды, добавление дробных миллисекунд также было бы неправильным.
Я бы сказал, что они пошли на компромисс - это лучше, чем выбросить исключение, и он будет работать так, как ожидало бы большинство программистов.
DateTime
и TimeSpan
округляют. Но зная, что тики - это интервалы 100 нс, вы можете обойти это:
var now = DateTime.Now;
var result = now + TimeSpan.FromTicks(10000 * 1.5);
(Есть 10 000 интервалов по 100 нс в 1 мс.)
РЕДАКТИРОВАТЬ: это исправлено, DateTime хранит количество внутренних элементов * 100 * нс (не 10 нс).