2010-05-20 13 views

Odpowiedz

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

lub

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

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

EDIT:

Po uruchomieniu zarówno poniżej na kodzie będę po, podwójna metoda działa dobrze z powodu ponownego użycia zmiennych. W iteracji 5000 000 dni DateTime.Now (w której wiele zostanie pominiętych przez obie kontrole), metoda SubString() trwała 9598 ms, a metoda Double zajęła 6754 ms.

EDYCJA # 2: Edytowano w * 1000 do testów, aby upewnić się, że iteracje są uruchomione.

kod używany do testowania następująco:

 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

Jaki jest najbardziej * wydajny * sposób? – stacker

+0

@stacker - Weź oba i przeprowadź je przez "Stoper" i zobacz, który jest szybszy? –

+0

Powiedziałbym, że 'Math.Pow' jest znacznie wolniejszy, ale to tylko domysły, przetestuj go za pomocą' StopWatch'. – IVlad

3

W DateTime, Milliseconds zawsze zawiera się między 0 a 999, więc nie mam nic do roboty.

+2

Cytując link MSDN Wysłałem w mojej odpowiedzi "Składnik milisekundowy wyrażony jako wartość z przedziału od 0 do 999". Wydaje się logiczne, że nie możesz mieć 32 dni w miesiącu ani więcej niż 999 ms w ciągu sekundy. –

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

gdzie x precyzję

+0

Cóż, myślę, że dałem odpowiedź z kontekstu. jednak myślałem, że pytasz o zaokrąglanie, w każdym razie nie mogę dostać to, co obcina nawet w liczbach, w każdym razie przepraszam za brak kontekstu. –

Powiązane problemy