Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

YearsBetween


учащийся ©   (2008-12-04 17:53:00) 

Почему функция неправильно округляет


YearsBetween(StrToDate('1.01.2008'), StrToDate('1.01.2009'))


Anatoly Podgoretsky   (2008-12-04 19:28:00) [1]

Формула подсчета относительная, по этому говорить о точности не приходится. Это же относится и к другим Between функциям.


KilkennyCat   (2008-12-04 18:43:00) [2]


> Германн ©   (04.12.08 18:40) [15]

?


KilkennyCat   (2008-12-04 18:41:00) [3]

тогда она может выдать и 56парпал45№
мы либо говорим о стандартной функции модуля DateUtils, либо фантазируем дальше?


Германн   (2008-12-04 18:40:00) [4]

В [0] количество дней между датами на один день больше за счет 29 февраля.


учащийся   (2008-12-04 18:39:00) [5]


> где она такое возвращает?


Я имел ввиду если переписать:


function _YearsBetween(const ANow, AThen: TDateTime): Integer;
 begin
   Result := Round(YearSpan(ANow, AThen));
 end;


KilkennyCat   (2008-12-04 18:37:00) [6]


> Но ведь возвращает 1

где она такое возвращает?


KilkennyCat   (2008-12-04 18:36:00) [7]


> Palladin ©

не врет. 0.
Полный год, а выдает функция именно полный год, будет между 23:59:59 31.12.2007 и 00:00:00 01.01.2009


Palladin   (2008-12-04 18:35:00) [8]


> учащийся   (04.12.08 18:34) [10]

да я не тебе, а KilkennyCat


учащийся   (2008-12-04 18:34:00) [9]


> ага, то есть YearsBetween(StrToDate('1.01.2008'), StrToDate('1.
> 01.2009')) функция врет :)


Но ведь возвращает 1 - то, что требуется


Германн   (2008-12-04 18:33:00) [10]

Лучше сначала правильно сформулировать задачу.


Palladin   (2008-12-04 18:31:00) [11]


> Между твоими датами действительно 0 лет. Функция не врет.
> сколько целых чисел между 1 и 2?

ага, то есть YearsBetween(StrToDate('1.01.2008'), StrToDate('1.01.2009'))функция врет :)


Palladin   (2008-12-04 18:30:00) [12]

Думаю нет. Как видишь из исходников количество дней делится на среднее количество дней в году, а это значит, что при определенных обстоятельствах ты можешь получить увеличение фактического количества лет. Вообще, рекомендую написать свою функцию.


KilkennyCat   (2008-12-04 18:28:00) [13]

Где ты собираешься менять? В исходниках? Тогда нет.
А если просто подумать?
Между твоими датами действительно 0 лет. Функция не врет.
сколько целых чисел между 1 и 2?


учащийся   (2008-12-04 18:27:00) [14]

Будет ли верно, во всех случаях, если я заменю Trunc на Round ...


Palladin   (2008-12-04 18:23:00) [15]


> Хотя заметил, что перед округлением (Trunc) в самой фуекции
> приходит значение 1.00

хто сказал... там приходит 0 с хвостиком, вот и хвостик оттрункивается...


учащийся   (2008-12-04 18:04:00) [16]

не тот случай привел. Вот возвращается 0.


procedure TForm1.FormCreate(Sender: TObject);
var
 y: Integer;
begin
 y := YearsBetween(StrToDate('4.10.2008'), StrToDate('4.10.2009'));
 ShowMessageFmt('%d', [y]);
end;

Хотя заметил, что перед округлением (Trunc) в самой фуекции приходит значение 1.00. Но почему оно округляется до 0 непонятно.


Palladin   (2008-12-04 17:58:00) [17]

лично у меня - 1


учащийся   (2008-12-04 17:56:00) [18]

Возвращает 0


Наверх

Титульная страница Поиск, карта сайта Написать письмо