2016-01-26 9 views
6

mam dwa razy w Ticks tak:Jak skrócić milisekundy z "Kleszczy" bez konwersji na datetime?

//2016-01-22​T17:34:52.648Z 
var tick1 = 635890808926480754; 

//2016-01-22​T17:34:52.000Z 
var tick2 = 635890808920000000; 

Teraz jak widać porównując te dwa numery tick1 == tick2 returns false

choć terminy są takie same (oprócz milisekundach).

Chciałbym obciąć milisekundy od tych liczb bez konwersji do datetime (bo to zmniejszyć wydajność)

Mam spojrzał na Math.Round który mówi:

zaokrągla wartość do najbliższa liczba całkowita lub określona liczba cyfr ułamkowych.

, a także Math.Truncate z których żaden nie myślę zrobić to, czego potrzebuję.

Patrząc na Datetime.Ticks mówi:

Pojedyncza kleszcz reprezentuje sto dziesięć nanosekund lub jednej milionowej sekundy. Jest 10 000 cykli w milisekundach lub 10 milionów cykli w ciągu sekundy.

Dlatego muszę zaokrąglić liczbę do najbliższych dziesięciu milionów.

Czy to możliwe?

+0

podziel go przez 10000000f i użyj Math.Ceil na wyniku? – Icepickle

Odpowiedz

11

Można użyć podział integer:

if (tick1/TimeSpan.TicksPerSecond == tick2/TimeSpan.TicksPerSecond) 

To działa, ponieważ jeśli podzielić long/int przez long/int wynik jest również long/int zatem obcinanie część dziesiętną.

+1

Nie jestem pewien, dlaczego jest to głosowanie.Jeśli 'tick1 == tick2 zwraca fałsz', to' tick1/10000000 == tick2/10000000' również zwróci wartość false, chyba że zostanie obcięte po podziale. To tylko algebra? Czy może czegoś brakuje? – user1

+2

@ user1 Ponieważ jest obcięty. Jeśli rozwiniesz 'long' lub' int' przez 'long' lub' int', wynikiem jest również "long" lub "int" obcięcie części dziesiętnej. –

+2

@ scottChamberlain masz rację. Pochodzę z matematyki, nienawidzę liczb w informatyce – user1

-1

podzielić przez 1000 tak:

Long Seconds = 635890808926480754/1000 

//Seconds = 635890808926480 
+0

Downvoter może również komentować. Pomoże mi zrozumieć mój błąd. –

+0

@ScottChamberlain Nie byłem downvoter. Nigdy nie zgodziłbym się na to, nie wiedząc na pewno, że odpowiedź jest nieprawidłowa – user1

+2

Dzielenie przez 1000 to za mało. Zgodnie z drugą odpowiedzią (i cytatem w pytaniu - "10 milionów kleszczy w ciągu sekundy" _), musisz zrobić to przez 10 000 000. –

6

Można to wykorzystać:

if(Math.Abs(tick1 - tick2) < TimeSpan.TicksPerSecond) 

Które uniknąć robi podziały.

można regulować dokładność trzeba z jedną z następujących czynności:

  • TimeSpan.TicksPerDay
  • TimeSpan.TicksPerHour
  • TimeSpan.TicksPerMinute
  • TimeSpan.TicksPerSecond
  • TimeSpan.TicksPerMillisecond
Powiązane problemy