2010-05-20 11 views

risposta

1
int ms = Convert.ToInt32(
      Convert.ToString(DateTime.Now.Millisecond).Substring(0, 3)); 

o

double Length = Math.Pow(10, (DateTime.Now.Millisecond.ToString().Length - 3)); 

double Truncate = Math.Truncate((double)DateTime.Now.Millisecond/Length); 

EDIT:

Dopo aver eseguito sia il seguito sul codice mi post, il metodo della partita doppia funziona bene a causa di riutilizzo delle variabili. Su un'iterazione di 5.000.000 DateTime.Ora (in cui molti verranno saltati da entrambi i controlli), il metodo SubString() ha richiesto 9598 ms e il metodo Double ha richiesto 6754 ms.

EDIT # 2: modificato in * 1000 nei test per assicurarsi che le iterazioni siano in esecuzione.

codice utilizzato per testare come segue:

 Stopwatch stop = new Stopwatch(); 
     stop.Start(); 

     for (int i = 0; i < 5000000; i++) 
     { 
      int MSNow = DateTime.Now.Millisecond * 1000; 

      if (MSNow.ToString().Length > 2) 
      { 
       int ms = Convert.ToInt32(
        Convert.ToString(MSNow).Substring(0, 3)); 
      } 
     } 

     stop.Stop(); 

     Console.WriteLine(stop.ElapsedMilliseconds); 

     stop = new Stopwatch(); 
     stop.Start(); 

     for (int i = 0; i < 5000000; i++) 
     { 
      int MSNow = DateTime.Now.Millisecond * 1000; 
      int lengthMS = MSNow.ToString().Length; 

      if (lengthMS > 2) 
      { 
       double Length = Math.Pow(10, (lengthMS - 3)); 
       double Truncate = Math.Truncate((double)MSNow/Length); 
      } 
     } 

     stop.Stop(); 

     Console.Write(stop.ElapsedMilliseconds); 

     Console.ReadKey(); 
+0

Qual è il modo * più * efficiente *? – stacker

+0

@stacker: prendi entrambi e eseguili attraverso un 'cronometro' e vedi quale è più veloce? –

+0

Direi che 'Math.Pow' è molto più lento, ma è solo un'ipotesi, provalo con un' StopWatch'. – IVlad

3

In un DateTime, Milliseconds sono sempre compreso tra 0 e 999 in modo da non avere a che fare.

+2

Citando il link MSDN che ho postato nella mia risposta "Componente dei millisecondi, espressa come valore compreso tra 0 e 999." Sembra logico che tu non possa avere 32 giorni in un mese né più di 999ms in un secondo. –

0
Math.Floor(num * Math.Pow(10, x) + 0.5)/Math.Pow(10, x) 

dove x la vostra precisione

+0

Beh, penso di aver dato una risposta fuori dal contesto. comunque ho pensato che stavi chiedendo Rounding, comunque non riesco a capire cosa significa troncare anche nei numeri, ad ogni modo mi dispiace per non aver raccolto il contesto. –

Problemi correlati