ich zwei Doppelzimmer in .NET bin zu teilen und unter Verwendung des Ergebnisses Objekt ein Enddatum von einem Startdatum durch den Aufruf zu erarbeiten (dtstart vordefiniert):Warum rundet DateTime.AddDays auf die nächste Millisekunde auf?
var dValue = 1500.0/8400.0;
var dtEnd = dtStart.AddDays(dValue);
Nach DTEND Inspektion fand ich, dass das Ergebnis nur war genau auf die nächste Millisekunde. Nach dem Nachschlagen fand ich, dass .AddMilliseconds etc. rund um die Nummer und TimeSpan.FromDays eine ähnliche Sache macht. Ich habe mich gefragt, ob es einen Grund gab, warum diese Rundung gemacht wurde, da es scheint, dass der einzige Weg, um den richtigen Wert zu erhalten, darin besteht, .AddTicks zu verwenden?
Als Referenz .AddDays Aufrufe (wobei MillisPerDay = 86400000)
public DateTime AddDays(double value)
{
return Add(value, MillisPerDay);
}
die
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);
}
Das kostet meine ziemlich viel Debugging-Zeit. Bevor ich Audio-bezogenen Code schrieb, berechnete ich, dass die Genauigkeit von Double und 'TimeSpan' ausreicht, um ein bestimmtes Sample eindeutig zu identifizieren. Und dann entschied sich die blöde 'FromSeconds'-Funktion dafür, auf Millisekunden zu runden ... – CodesInChaos