- 1
- 2
- 3
- 4
double numberOfDays = (eventWrite.EndDate - eventWrite.StartDate).Days;
int numberOfSteps = (int)numberOfDays / 365;
if (numberOfDays / 365 % 4.0027397260273974 == 0)
numberOfSteps++;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+143
double numberOfDays = (eventWrite.EndDate - eventWrite.StartDate).Days;
int numberOfSteps = (int)numberOfDays / 365;
if (numberOfDays / 365 % 4.0027397260273974 == 0)
numberOfSteps++;
Сколько раз повторится ежегодное событие с учётом високосного года
Ещё есть ежегодное событие, происходящее 29 февраля.
Хотя, тогда в 2100м и 2400м будет работать так же, как и в остальные.
Если считать, что високосный - это раз в 4 года, разница компенсации невисокосных годов 100 лет (вроде бы) набежит где-то за 365*100 лет.
(но в итоге исправили на нормальный код)
numberOfDays / 365 % 4.0027397260273974 == 0 ниче так,
хотя проще нада быть , проще
Мне - нет.
Нет. Т.к. double numberOfDays.
> Я молчу уже про ставнение флоатов.
Да ладно сравнение... Там еще и остаток от деления чисел с плавающей точкой считают...
Асло, мне очень сильно кажется, что кто-то не осилил модуль работы с календарем... Скажите, в СНГ на уроках программирования все еще учат вручную високосные годы считать?
>Там еще и остаток от деления чисел с плавающей точкой считают...
Ну а че, работает же, в отличие от сравнения с 0.
for (var i = eventWrite.StartDate; i <= eventWrite.EndDate; i = i.AddYears(1))
Выходит, для 365*4 - 4 события, 365*4+1 - 5 событий, 365*4+2 - снова 4 события.
Это я туплю, или код не работает безупречно?
соответственно, numberOfSteps будет 4, если n != 0, n < 364
странно, толи я какой-то код потерял, толи туплю...
я уже точно не помню, возможно просто там всегда дата конца и дата начала отличались только годом... в ближайшие дни постараюсь уточнить и отписать сюда )
То есть дата конца не обязательно означает срабатывание события. Логично делать дату А и Б, отличающуюся только годом, но в данном случае пользователю дана свобода
значит в бд будут записаны подсобытия каждый год 29 февраля, но срабатывать они всё равно не будут.
Хотя, .NET наверно не даст создать DateTime с 29 февраля в неправильный год.
вообще, спасибо, потестирую
Год прибавить даст.
Но, судя по коду, для 4N лет, точнее - для (3*365+366)*N дней numberOfSteps будет равным 4N+1.
При этом, для (3*365+366)*N + n будет 4N для малых n.
(если кто ещё не понял - код писался в полу-шутку, не могли сразу понять как надо, написали чтоб работало, а потом на следующий день написали нормально и зарегистрировались на говнокоде)
Ну хорошо, я примерно понимаю, что это, но только моё понимание не стыкуется с "==0".
Например, в моём понимании 1%4.0027 равно 1, а 5%4.0027 равно 0.9973
Какой-то сишарпобред походу.
Как интеловский fprem видимо. Он, емнип, так и считает, как ты написал.
> ==0
Ну а тут да. Никто не гарантирует, что последний разряд не разойдется.
з.ы. если бы это был нормальный код, стал бы я тут его выкладывать?
1./365 % .0027397260273974
0.0027397260273972603
от настроек фпу зависит
сейчас просто время проверить нету.
0.0027397260273972603
vs
0.0027397260273974