Почему AddMilliseconds округляет двойной параметр? - PullRequest
8 голосов
/ 22 апреля 2010
DateTime.Now.AddMilliseconds(1.5); // adds 2 milliseconds

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

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

РЕДАКТИРОВАТЬ: просто еще раз подчеркнуть пункт:

AddSeconds(1.5); // Adds 1500 milliseconds

Ответы [ 4 ]

4 голосов
/ 22 апреля 2010

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

Обходной путь прост, просто используйте AddTicks (1,5 * 10000).

2 голосов
/ 22 апреля 2010

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

1 голос
/ 22 апреля 2010

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

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

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

0 голосов
/ 22 апреля 2010

С MSDN :

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

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

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

...