sto dividendo due doppie in .NET e utilizzando l'oggetto risultato di elaborare una data di fine da una data di inizio chiamando (dtstart è predefinito):Perché DateTime.AddDays viene arrotondato al millisecondo più prossimo?
var dValue = 1500.0/8400.0;
var dtEnd = dtStart.AddDays(dValue);
Dopo aver ispezionato DTEND ho scoperto che il risultato solo è stato accurato al millisecondo più vicino. Dopo averlo trovato, ho trovato che .AddMilliseconds ecc. Per tutto il numero e TimeSpan.FromDays fa una cosa simile. Mi stavo chiedendo se ci fosse un motivo per cui questo arrotondamento è stato fatto poiché sembra che l'unico modo per ottenere il valore corretto qui sia usare .AddTicks?
Per .AddDays di riferimento chiamate (dove MillisPerDay = 86400000)
public DateTime AddDays(double value)
{
return Add(value, MillisPerDay);
}
che chiama
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);
}
Questo mi è costato un bel po 'di tempo per il debug. Prima di scrivere un codice relativo all'audio ho calcolato che la precisione sia del doppio sia del 'TimeSpan' è sufficiente per identificare univocamente un particolare campione. E poi la stupida funzione 'FromSeconds' ha deciso di arrotondare a millisecondi ... – CodesInChaos