- 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++;
Сколько раз повторится ежегодное событие с учётом високосного года
SUDALV 26.11.2013 13:00 # +4
Stertor 26.11.2013 13:01 # −4
unu-foja 27.11.2013 20:22 # 0
bormand 27.11.2013 20:32 # +1
1024-- 27.11.2013 20:39 # 0
Ещё есть ежегодное событие, происходящее 29 февраля.
1024-- 27.11.2013 20:51 # +3
Хотя, тогда в 2100м и 2400м будет работать так же, как и в остальные.
Если считать, что високосный - это раз в 4 года, разница компенсации невисокосных годов 100 лет (вроде бы) набежит где-то за 365*100 лет.
SUDALV 27.11.2013 21:53 # +1
(но в итоге исправили на нормальный код)
spivti 27.11.2013 18:23 # 0
numberOfDays / 365 % 4.0027397260273974 == 0 ниче так,
хотя проще нада быть , проще
SUDALV 27.11.2013 19:00 # 0
anonimb84a2f6fd141 27.11.2013 18:26 # −2
1024-- 27.11.2013 19:02 # 0
anonimb84a2f6fd141 27.11.2013 19:03 # −2
Мне - нет.
1024-- 27.11.2013 19:04 # +3
anonimb84a2f6fd141 27.11.2013 19:06 # −3
bormand 27.11.2013 19:09 # +1
Нет. Т.к. double numberOfDays.
> Я молчу уже про ставнение флоатов.
Да ладно сравнение... Там еще и остаток от деления чисел с плавающей точкой считают...
anonimb84a2f6fd141 27.11.2013 19:11 # −2
Асло, мне очень сильно кажется, что кто-то не осилил модуль работы с календарем... Скажите, в СНГ на уроках программирования все еще учат вручную високосные годы считать?
>Там еще и остаток от деления чисел с плавающей точкой считают...
Ну а че, работает же, в отличие от сравнения с 0.
SUDALV 27.11.2013 19:20 # 0
for (var i = eventWrite.StartDate; i <= eventWrite.EndDate; i = i.AddYears(1))
anonimb84a2f6fd141 27.11.2013 19:21 # −1
SUDALV 27.11.2013 19:08 # 0
1024-- 27.11.2013 19:12 # +1
Выходит, для 365*4 - 4 события, 365*4+1 - 5 событий, 365*4+2 - снова 4 события.
Это я туплю, или код не работает безупречно?
SUDALV 27.11.2013 19:24 # 0
SUDALV 27.11.2013 19:26 # 0
1024-- 27.11.2013 19:30 # 0
соответственно, numberOfSteps будет 4, если n != 0, n < 364
SUDALV 27.11.2013 19:42 # 0
странно, толи я какой-то код потерял, толи туплю...
я уже точно не помню, возможно просто там всегда дата конца и дата начала отличались только годом... в ближайшие дни постараюсь уточнить и отписать сюда )
SUDALV 27.11.2013 19:47 # 0
anonimb84a2f6fd141 27.11.2013 19:51 # −4
SUDALV 27.11.2013 19:57 # 0
То есть дата конца не обязательно означает срабатывание события. Логично делать дату А и Б, отличающуюся только годом, но в данном случае пользователю дана свобода
anonimb84a2f6fd141 27.11.2013 19:59 # −3
SUDALV 27.11.2013 20:00 # +1
anonimb84a2f6fd141 27.11.2013 21:08 # −3
SUDALV 27.11.2013 21:55 # 0
значит в бд будут записаны подсобытия каждый год 29 февраля, но срабатывать они всё равно не будут.
Хотя, .NET наверно не даст создать DateTime с 29 февраля в неправильный год.
вообще, спасибо, потестирую
anonimb84a2f6fd141 27.11.2013 23:29 # 0
Год прибавить даст.
1024-- 27.11.2013 19:56 # 0
Но, судя по коду, для 4N лет, точнее - для (3*365+366)*N дней numberOfSteps будет равным 4N+1.
При этом, для (3*365+366)*N + n будет 4N для малых n.
SUDALV 27.11.2013 20:09 # 0
(если кто ещё не понял - код писался в полу-шутку, не могли сразу понять как надо, написали чтоб работало, а потом на следующий день написали нормально и зарегистрировались на говнокоде)
TarasB 27.11.2013 21:11 # +5
Ну хорошо, я примерно понимаю, что это, но только моё понимание не стыкуется с "==0".
Например, в моём понимании 1%4.0027 равно 1, а 5%4.0027 равно 0.9973
Какой-то сишарпобред походу.
bormand 27.11.2013 21:14 # 0
Как интеловский fprem видимо. Он, емнип, так и считает, как ты написал.
> ==0
Ну а тут да. Никто не гарантирует, что последний разряд не разойдется.
anonimb84a2f6fd141 27.11.2013 21:23 # −1
SUDALV 27.11.2013 21:57 # +3
з.ы. если бы это был нормальный код, стал бы я тут его выкладывать?
anonimb84a2f6fd141 27.11.2013 23:29 # 0
SUDALV 28.11.2013 12:54 # 0
anonimb84a2f6fd141 28.11.2013 13:14 # 0
1./365 % .0027397260273974
0.0027397260273972603
TarasB 28.11.2013 13:16 # 0
от настроек фпу зависит
SUDALV 28.11.2013 13:20 # 0
сейчас просто время проверить нету.
anonimb84a2f6fd141 28.11.2013 14:45 # +1
anonimb84a2f6fd141 28.11.2013 14:44 # 0
0.0027397260273972603
vs
0.0027397260273974
1024-- 28.11.2013 14:00 # +1
105_306330_ru 24.08.2021 20:46 # 0