Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2006, 12:15   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию помогите разделить

перенесено со старого форума. сообщение от CAM.

Имеется:
А:=123,45;
Надо получить:
В:=123;
С:=45;

А: Double;
В,С:integer;

перенесено со старого форума. сообщение от Virtson.

B:= trunc(A);
C:= (A-B)*100;

в общем случае для С нужно подумать.
можно преобразовать строку и выделить часть, потом обратно

перенесено со старого форума. сообщение от zetrix.

Можно и так (возможно сложный метод), работая со строкой:

Procedure razdel(xouble;var c,d:integer);//х - исходное (дробное) число в переменные c и d - будут записаны значения c - целая часть, d - дробная часть

var i:integer;s,s1,s2:string;

begin

s:=floattostr(x);//перевод числа в строку

for i:=1 to length(s) do //цикл пробега строки посимвольно

begin

if (s[i]='.')or(s[i]=',') then //ищем запятую (на некоторых системах используется точка)

begin

s2:=s1;

s1:='';

end

else s1:=s1+s[i];

end;

c:=strtoint(s2);//в с заносим целую часть

d:=strtoint(s1);//в d заносим дробную часть

end;


Такой метод сложен, и требуется контролировать входные данные. Например если будет введено целое число, то произойдёт ошибка. При х=123 - ошибка, при х=123,0 - ошибки не будет.
Я вроде тоже припоминаю что есть спец функция для выделения целой дробной части...

Хм... не.. это было сложно, вот метод Virtson доделаный до общего случая:

Procedure razdel(xouble;var c,d:string);

var i:integer;

begin

i:=trunc(x);

c:=inttostr(i);

d:=floattostr(x-i);

form1.Label2.Caption:=c+' '+d;

if d<>'0' then delete(d,1,2);

end;


Есть минус: введём число 484,99 и получим 484 и 990000000000009
Это скорее всего из-за представления дробных чисел в ЭВМ.
Как избавится от этого? Не знаю. Подумаю...

перенесено со старого форума. сообщение от Вася.

var e,r:extended;

s:string;

i:integer;

begin

r := 123.45; // Вводим число

s := FloatToStr(int(r)); // Отделяем целу часть и конвертим в string...

e := Frac(r); // Отделяем дробную часть. Результат: 0,45

for i := 1 to (Length(FloatToStr(e)) - 2) do // Домножаем необходимое кол-во раз

e := e*10;

s := s + ' ' + FloatToStr(e); // Записываем результат в строку

end;


В принципе можешь так же и в integer переводить... либо сразу либо IntToStr()! )
Alar вне форума Ответить с цитированием
Старый 30.10.2006, 12:16   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

перенесено со старого форума. сообщение от CAM.

Всем кто помагал огромное СПАСИБО!

Есть минус: введём число 484,99 и получим 484 и 990000000000009
Как избавится от этого...?

перенесено со старого форума. сообщение от Virtson.

> for i := 1 to (Length(FloatToStr(e)) - 2) do // Домножаем необходимое кол-во раз e := e*10;

вообще-то дробная часть имеет смысл только до определеной длины (заранее известной).
например, 4/3 = 1,333333333333333333333333333333333

количество 3 зависит от типа (float, double, extended)

перенесено со старого форума. сообщение от Вася.

САМ, знаешь, я ввожу и у меня получается 484 и 99... в моём коде...

А не, постой...

Если переменные будут типа: Currency или Extended то всё будет нормально отделяться..., а если типа real и прочих то вот так! )

> вообще-то дробная часть имеет смысл только до определеной длины
> (заранее известной).
> например, 4/3 = 1,333333333333333333333333333333333
> количество 3 зависит от типа (float, double, extended)

Ну, это понятно... А, ты этим, что хотел сказать??? Я просто туплю... )


перенесено со старого форума. сообщение от Virtson.

то, что для любых практических целей кол-во знаков в дробной части нужно задавать конкретно, и не пологаться на FloatToStr.
Вобще Format() рулит.

перенесено со старого форума. сообщение от CAM.

По-поводу исходной задачи:
Имеется
А=123,45;
Надо получить:
В=123;
С=45;
Сделал так:
В:=Trunc(А); // В=123
С:=Trunc(А*100) mod 100; // С=45, но тут есть ньюансы с округлением, например:
А=59,49; В=59; С=39 а надо С=40!

Как быть, что делать?

перенесено со старого форума. сообщение от plague.

SetRoundMode(rmDown);
SetRoundMode(rmUp);
переменная:=roundto(число, N);
Alar вне форума Ответить с цитированием
Старый 03.11.2006, 13:52   #3
Влад
 
Регистрация: 01.11.2006
Сообщений: 7
По умолчанию

b:=a div 1;
c:=a mod1;
Мне так кажется...
Влад вне форума Ответить с цитированием
Старый 03.11.2006, 15:02   #4
Гриха
Вернулся
Форумчанин
 
Аватар для Гриха
 
Регистрация: 29.10.2006
Сообщений: 174
По умолчанию

про div и mod давно забыли...а зря
...double...вещественный тип
...учись так - будто будешь жить вечно...
...живи так - будто умирать завтра...

Последний раз редактировалось zetrix; 06.11.2006 в 11:25.
Гриха вне форума Ответить с цитированием
Старый 03.11.2006, 22:48   #5
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от Гриха Посмотреть сообщение
про div и mod давно забыли...а зря.
Потому что Паскаль не учат... Не забыли, а не знали, наверное.
Alar вне форума Ответить с цитированием
Старый 05.11.2006, 20:13   #6
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
Потому что Паскаль не учат... Не забыли, а не знали, наверное.
Не то что Паскаль... Народ Basic давно в лицо не видел, а про Asm вооьще слышали от дяди с какого-то странного форума про низкоуровневое программирование.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 13.11.2006, 19:48   #7
Janekool
 
Регистрация: 13.11.2006
Сообщений: 4
По умолчанию

А как написать программу для примера:
Ln:=(8*10^-7)*Lm
Lm:=0.055
Janekool вне форума Ответить с цитированием
Старый 13.11.2006, 19:55   #8
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Цитата:
Сообщение от Janekool Посмотреть сообщение
10^-7
Это возведение в степень?
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 13.11.2006, 20:45   #9
Janekool
 
Регистрация: 13.11.2006
Сообщений: 4
По умолчанию

да (10^-7) это десять в минус седьмой степени

Последний раз редактировалось Janekool; 13.11.2006 в 22:15.
Janekool вне форума Ответить с цитированием
Старый 14.11.2006, 06:13   #10
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

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

function Power(Base, Exponent: Extended): Extended;
begin
if Exponent = 0.0 then Result := 1.0
else if (Base = 0.0) and (Exponent > 0.0) then Result := 0.0
else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
Result := IntPower(Base, Trunc(Exponent))
else Result := Exp(Exponent * Ln(Base))
end;

function IntPower(Base: Extended; Exponent: Integer): Extended;
var
Y: Longint;
begin
Y := Abs(Exponent);
Result := 1.0;
while Y > 0 do begin
while not Odd(Y) do begin
Y := Y shr 1;
Base := Base * Base;
end;
Dec(Y);
Result := Result * Base;
end;
if Exponent < 0 then Result := 1.0 / Result;
end;

Отсюда следует, что решение твоей функции таково:
N:=(8*IntPower(10,-7))*Lm;
Переменная названа N, так как Ln - стандартная функция натурального логарифма в паскаль.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделить дату на год,месяц, день Avalonix Общие вопросы Delphi 11 28.05.2008 09:56
Помогите разделить цифры по ячейкам Alex2019 Microsoft Office Excel 8 01.02.2008 07:10
Разделить строку на три столбца инженер Microsoft Office Excel 10 01.02.2008 04:58
как разделить текст на переменные GAGARIN-NEW Общие вопросы Delphi 2 07.10.2007 15:24
Как разделить текст в Tedit на 2 переменные. Ната Общие вопросы Delphi 2 23.04.2007 12:48