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

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

Проблема Extended или туплю? [D7, WinXP]


markers ©   (2009-01-22 20:21:00) 

Вообщем имею такой код (ещё не всё написал, так как столкнулся с граблями кои послужили поводом этого вопроса):
{Дни в недели, месяцы, года}
function DaysToStr(iDays: integer): string;
var Years, Month, Weeks, Days, TempI : Extended;
   TempS, Temp2S : String;
   ExDays : Extended;
function YearsD(Var daysy : Extended): Extended;
begin
 daysy := daysy / 365;
 Result := RoundEx(daysy, 1);
 {}
 TempS := FloatToStr(daysy);
 delete(TempS, 1, BMSearch(1, TempS, DecimalSeparator)+1);
 daysy := StrToFloat(TempS);
 if 1<>1 then Exit;

end;
function MonthD(Var daysy : Extended): Extended;
begin
 //
end;
function DaysD(Var daysy : Extended): Extended;
begin
 //
end;

begin
try
  ExDays := iDays;
  if ExDays >= 365 then Years := YearsD(ExDays);
  if ExDays >= 30 then Month := MonthD(ExDays);
  if ExDays < 30 then Days := DaysD(ExDays);
except
 //
end;

end;

А теперь собственно вопрос! при вызове функций   TempS := FloatToStr(daysy); и после daysy := StrToFloat(TempS); почему-то цифра существенно меняется. к примеру на входе было 455 (дней) код делим на 365 получаем 1,2465753424657534246575342465753, сохраняем получившееся количество лет (целое) в переменную, и отсекаем это, в итоге должно получится 2465753424657534246575342465753, а получаются когда верные а когда неверные цифры (неверные совсем) при тех-же входящих данных.
ЗЫ: длинные цифры даны из калка, в дельфях по короче.
Надеюсь не туплю :) Заранее спасибо!


Правильный$Вася   (2009-01-23 11:42:00) [1]


> имеем число, и это число надо развернуть в годы/месяцы/дни

число чего? или это дата?
если дата, то от какого момента?


markers   (2009-01-23 08:15:00) [2]


> MBo ©   (23.01.09 08:08) [10]

Сорри, понял вашу мысль! переделал!
  Years := iDays div 365;
  t := iDays mod 365;
  Month := t div 30;
  Days := t mod 30;

Спасибо!


markers   (2009-01-23 08:11:00) [3]


> MBo ©   (23.01.09 08:08) [10]

функа Trunc потребляет Extended и на выходе in64, а для Extended мона и / вместо дива.


MBo   (2009-01-23 08:08:00) [4]

>Trunc(iDays / 365);

div


markers   (2009-01-23 07:52:00) [5]

Да, терь понял! вообщем я начал в нужном направлении сначала, но делал неверно, и не подумав достаточно правильно чтоб достаточно полазить в инете! Вообщем понял я про отсечение и про остаток :) Собственно почти что в самом начале и не хватало :) Премного благодарен! (Правильная критика только на пользу)


markers   (2009-01-23 07:38:00) [6]

За:
Years := Trunc(iDays / 365);
t := iDays mod 365;
Month := Trunc(t / 30);
Days := t mod 30;

спасибо, не знал (век живи век учись), и это дало немного изучить использование mod и Trunc и сопутствующие вещи. А задача была у меня следующая, имеем число, и это число надо развернуть в годы/месяцы/дни.


AndreyV   (2009-01-23 07:03:00) [7]

> [6] markers ©   (23.01.09 04:15)
> про деление по модулю не слышал.... за пояснения буду благодарен.
> А 365 и 30 это так придумал.

Циклы ты наверно делал методом тыка - лишь бы что-то получилось. В каждой строчке у тебя, уж извини, - ерунда.

Поясни цель всего этого. Изучение функций что ли? Не проще ли

function DaysToStr(iDays: integer): string;
var Years, Month, Days, t : integer;

begin
 Years := Trunc(iDays / 365);
 t := iDays mod 365;
 Month := Trunc(t / 30);
 Days := t mod 30;

 Result := '';
 if Years > 0 then Result := Result + ' ' + IntToStr(Years) + ' лет';
 if Month > 0 then Result := Result + ' ' + IntToStr(Month) + ' месяцев';
 if Days > 0 then Result := Result + ' ' + IntToStr(Days) + ' дней';
end;


И в году бывает 366 дней, и в месяцах не во всех 30.


markers   (2009-01-23 04:15:00) [8]


> AndreyV ©   (22.01.09 23:08) [5]
> > [3] markers ©   (22.01.09 20:56)Это я не увидел.Ты слышал
> об операциях деления и деления по модулю?

про деление по модулю не слышал.... за пояснения буду благодарен. А 365 и 30 это так придумал.


AndreyV   (2009-01-22 23:08:00) [9]

> [3] markers ©   (22.01.09 20:56)

Это я не увидел.
Ты слышал об операциях деления и деления по модулю?


AndreyV   (2009-01-22 22:49:00) [10]

Зачем здесь Extended и все эти преобразования в строку и обратно, не хочешь целые применить? Затем 365, 30 - это в алгоритме так или сам придумал?


markers   (2009-01-22 20:56:00) [11]

Эх, вообщем полностью переделал и теперь работает! Если кому-то надо, то вот (за склонения и т.д., а точней за их отсутствие уж извините):
{Дни в Дней, Месяцев, Лет}
function DaysToStr(iDays: integer): string;
var Years, Month, Weeks, Days, i : integer;

function YearsD(Var daysy : integer): integer;
var  i : integer;
begin
 for i:=0 to daysy do
  begin
   if daysy < 365 then Break;
   Result := i+1;
   daysy := daysy - 365;
  end;
end;

function MonthD(Var daysy : integer): integer;
var  i : integer;
begin
 for i:=0 to daysy do
  begin
   if daysy < 30 then Break;
   Result := i+1;
   daysy := daysy - 30;
  end;
end;

begin
try
  if iDays >= 365 then Years := YearsD(iDays);
  if iDays >= 30 then Month := MonthD(iDays);
  if iDays < 30 then Days := iDays;
  {}
  Result := '';
  if Years > 0 then Result := Result + ' ' + IntToStr(Years) + ' лет';
  if Month > 0 then Result := Result + ' ' + IntToStr(Month) + ' месяцев';
  if Days > 0 then Result := Result + ' ' + IntToStr(Days) + ' дней';
except
 //
end;

end;


markers   (2009-01-22 20:32:00) [12]

вот блин, написал, решил ещё раз поковырятся и поэксперементировать (до этого полночи мучил) и получилось :) поменял Extended на Currency и в delete(TempS, 1, BMSearch(1, TempS, DecimalSeparator));убрал косяк (было +1 к количеству удаляемых символов)
Пока тесты вадёют одни и теже результаты :) извините за беспокойстро, тема закрыта!


markers   (2009-01-22 20:24:00) [13]

Сорри под КОД не убрал и строка if 1<>1 then Exit;стоит для дебага чтоб не выходил из функции сразу а остановился на этой строке.


Наверх

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