Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Вниз

Проблема 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.049 c
2-1232896639
И. Павел
2009-01-25 18:17
2009.03.15
Как показать модальное окно только после CreateRectRgn?


15-1231521954
Кое кто
2009-01-09 20:25
2009.03.15
Как называлась программа


6-1200671377
Somes
2008-01-18 18:49
2009.03.15
Терминальный доступ. Поиск по удалённой машине.


2-1213617871
Layner
2008-06-16 16:04
2009.03.15
Как по "правильному" распарсить стр. дату "22/06/2008 08:54:04"


15-1231365013
dmk
2009-01-08 00:50
2009.03.15
Vista64 и X58





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский