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

Вниз

Проблема Extended или туплю?   Найти похожие ветки 

 
markers ©   (2009-01-22 20:21) [0]

Вообщем имею такой код (ещё не всё написал, так как столкнулся с граблями кои послужили поводом этого вопроса):
{Дни в недели, месяцы, года}
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, а получаются когда верные а когда неверные цифры (неверные совсем) при тех-же входящих данных.
ЗЫ: длинные цифры даны из калка, в дельфях по короче.
Надеюсь не туплю :) Заранее спасибо!


 
markers ©   (2009-01-22 20:24) [1]

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


 
markers ©   (2009-01-22 20:32) [2]

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


 
markers ©   (2009-01-22 20:56) [3]

Эх, вообщем полностью переделал и теперь работает! Если кому-то надо, то вот (за склонения и т.д., а точней за их отсутствие уж извините):
{Дни в Дней, Месяцев, Лет}
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;


 
AndreyV ©   (2009-01-22 22:49) [4]

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


 
AndreyV ©   (2009-01-22 23:08) [5]

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

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


 
markers ©   (2009-01-23 04:15) [6]


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

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


 
AndreyV ©   (2009-01-23 07:03) [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 07:38) [8]

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

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


 
markers ©   (2009-01-23 07:52) [9]

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


 
MBo ©   (2009-01-23 08:08) [10]

>Trunc(iDays / 365);

div


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


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

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


 
markers ©   (2009-01-23 08:15) [12]


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

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

Спасибо!


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


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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.018 c
15-1231142074
Зязиков Мухамед
2009-01-05 10:54
2009.03.15
шареваре сделать


2-1232432057
Mishenka
2009-01-20 09:14
2009.03.15
Как убрать отображение на панеле задач формы открытой из Dll ?


2-1232683437
AlexDan
2009-01-23 07:03
2009.03.15
Сепаратор.


3-1216717712
DelphiN!
2008-07-22 13:08
2009.03.15
Поиск символа из масcива в строке


2-1233054476
Merry
2009-01-27 14:07
2009.03.15
операции с датами