jestem dzieląc dwa dwuosobowe w .NET i przy użyciu obiektu rezultatu, który ma wypracować datę z datą rozpoczęcia przez wywołanie (dtstart jest predefiniowany):Dlaczego DateTime.AddDays zaokrągla do najbliższej milisekundy?
var dValue = 1500.0/8400.0;
var dtEnd = dtStart.AddDays(dValue);
Po zbadaniu dtend Okazało się, że wynik był tylko z dokładnością do najbliższej milisekundy. Po sprawdzeniu tego znalazłem, że .AddMilliseconds itp. Wokół numeru i TimeSpan.FromDays robi podobną rzecz. Zastanawiam się, czy był jakiś powód, dla którego to zaokrąglenie zostało wykonane, ponieważ wydaje się, że jedynym sposobem uzyskania poprawnej wartości jest użycie .AddTicks?
Dla .AddDays referencyjne połączeń (gdzie MillisPerDay = 86400000)
public DateTime AddDays(double value)
{
return Add(value, MillisPerDay);
}
który nazywa
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);
}
Kosztowało to trochę czasu na debugowanie. Przed napisaniem jakiegoś kodu związanego z dźwiękiem obliczyłem, że dokładność zarówno podwójnej, jak i "TimeSpan" wystarcza, aby jednoznacznie zidentyfikować konkretną próbkę. I wtedy głupia funkcja "FromSeconds" zdecydowała się zaokrąglić do milisekund ... – CodesInChaos