Почему делает AddMilliseconds вокруг двойного параметра?

DateTime.Now.AddMilliseconds(1.5); // adds 2 milliseconds

Что же, спрашивается, они думали здесь? Это кажется мне страшно плохой практикой для создания метода, который берет двойное, если это не обрабатывает дробные значения. Почему они не реализовали это с вызовом к AddTicks и обработали часть правильно? Или, по крайней мере, возьмите интервал, таким образом, это очевидно для вызывающих сторон?

Я предполагаю, что должно быть серьезное основание, почему они реализовали его этот путь, но я не могу думать, каково это могло быть. Кто-либо может предложить понимание?

Править: только далее подчеркнуть мысль:

AddSeconds(1.5); // Adds 1500 milliseconds
8
задан Rupesh Yadav 11 January 2012 в 13:37
поделиться

4 ответа

Это компромисс, но не совсем необоснованный. Переданный аргумент должен округлить , чтобы иметь дело с разрешением DateTime. Округление с точностью до тика (100 наносекунд) является проблемой. Double не имеет достаточного количества значащих цифр, чтобы охватить весь диапазон возможных дат. 10000 лет x 365 x 24 x 3600 x 1000 x 10000 = 3E18, double имеет только 15 значащих цифр. Нет проблем с округлением до миллисекунды, 3E14 просто достаточно хорошо (каковы шансы?)

Решение простое, просто используйте AddTicks (1,5 * 10000).

4
ответ дан 5 December 2019 в 22:17
поделиться

Это действительно кажется довольно странным. Моя единственная мысль заключается в том, что, возможно, они посчитали, что лучше округлить до ближайшей миллисекунды, чем рисковать, что вызывающий абонент усекает double до int. Да, это довольно слабое объяснение. Извините.

2
ответ дан 5 December 2019 в 22:17
поделиться

Из MSDN :

Значение в миллисекундах округляется до ближайшего целого числа перед добавлением к указанному DateTime.

Поскольку DateTime не может разрешить ничего, меньшее, чем миллисекунды, добавление дробных миллисекунд также было бы неправильным.

Я бы сказал, что они пошли на компромисс - это лучше, чем выбросить исключение, и он будет работать так, как ожидало бы большинство программистов.

-1
ответ дан 5 December 2019 в 22:17
поделиться

DateTime и TimeSpan округляют. Но зная, что тики - это интервалы 100 нс, вы можете обойти это:

var now = DateTime.Now;
var result = now + TimeSpan.FromTicks(10000 * 1.5);

(Есть 10 000 интервалов по 100 нс в 1 мс.)

РЕДАКТИРОВАТЬ: это исправлено, DateTime хранит количество внутренних элементов * 100 * нс (не 10 нс).

1
ответ дан 5 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: