Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.18;
Скачать: CL | DM;

Вниз

YearsBetween   Найти похожие ветки 

 
учащийся   (2008-12-04 17:53) [0]

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


YearsBetween(StrToDate("1.01.2008"), StrToDate("1.01.2009"))


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

Возвращает 0


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

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


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

не тот случай привел. Вот возвращается 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 18:23) [4]


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

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


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

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


 
KilkennyCat ©   (2008-12-04 18:28) [6]

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


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

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


 
Palladin ©   (2008-12-04 18:31) [8]


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

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


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

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


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


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


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


 
Palladin ©   (2008-12-04 18:35) [11]


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

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


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


> Palladin ©

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


 
KilkennyCat ©   (2008-12-04 18:37) [13]


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

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


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


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


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


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


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

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


 
KilkennyCat ©   (2008-12-04 18:41) [16]

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


 
KilkennyCat ©   (2008-12-04 18:43) [17]


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

?


 
Anatoly Podgoretsky ©   (2008-12-04 19:28) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2009.01.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
2-1228409073
Tugodum
2008-12-04 19:44
2009.01.18
Изменение Атрибута


2-1228576692
neon-w
2008-12-06 18:18
2009.01.18
Столбец из .txt в массив?


1-1205853001
Ega23
2008-03-18 18:10
2009.01.18
Наследование фреймов - подводные камни


2-1228206229
Vitaliy_____
2008-12-02 11:23
2009.01.18
TList и много объектов


1-1206264052
MiHoY
2008-03-23 12:20
2009.01.18
VC DLL + Delphi