Я разделив два двойников в .NET и использование объекта результата отработать дату окончания с даты начала по телефону (dtStart предопределена):Почему DateTime.AddDays округляется до ближайшей миллисекунды?
var dValue = 1500.0/8400.0;
var dtEnd = dtStart.AddDays(dValue);
После осмотра dtEnd я обнаружил, что результат был только с точностью до ближайшей миллисекунды. Посмотрев его, я обнаружил, что .AddMilliseconds и т. Д. Вокруг числа и TimeSpan.FromDays делает аналогичную вещь. Мне было интересно, была ли причина, почему это округление было сделано, поскольку кажется, что единственный способ получить правильное значение здесь - использовать .AddTicks?
Для ссылки .AddDays вызовов (где MillisPerDay = 86400000)
public DateTime AddDays(double value)
{
return Add(value, MillisPerDay);
}
который называет
private DateTime Add(double value, int scale)
{
long millis = (long)(value * scale + (value >= 0? 0.5: -0.5));
if (millis <= -MaxMillis || millis >= MaxMillis)
throw new ArgumentOutOfRangeException("value", Environment.GetResourceString("ArgumentOutOfRange_AddValue"));
return AddTicks(millis * TicksPerMillisecond);
}
Это стоило мне довольно много времени отладки. Перед написанием некоторого кода, связанного с аудио, я подсчитал, что точности как double, так и 'TimeSpan' достаточно, чтобы однозначно идентифицировать конкретный образец. И тогда глупая функция «FromSeconds» решила округлить до миллисекунды ... – CodesInChaos