Форум: "Начинающим";
Текущий архив: 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.04 c