|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.10.2006, 12:15 | #1 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,608
|
помогите разделить
перенесено со старого форума. сообщение от 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()! ) |
30.10.2006, 12:16 | #2 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,608
|
перенесено со старого форума. сообщение от 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); |
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 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,608
|
Потому что Паскаль не учат... Не забыли, а не знали, наверное.
|
05.11.2006, 20:13 | #6 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
Не то что Паскаль... Народ Basic давно в лицо не видел, а про Asm вооьще слышали от дяди с какого-то странного форума про низкоуровневое программирование.
Познавая других, мы познаем себя.
С'est la vie... |
13.11.2006, 19:48 | #7 |
Регистрация: 13.11.2006
Сообщений: 4
|
А как написать программу для примера:
Ln:=(8*10^-7)*Lm Lm:=0.055 |
13.11.2006, 19:55 | #8 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
Познавая других, мы познаем себя.
С'est la vie... |
13.11.2006, 20:45 | #9 |
Регистрация: 13.11.2006
Сообщений: 4
|
да (10^-7) это десять в минус седьмой степени
Последний раз редактировалось Janekool; 13.11.2006 в 22:15. |
14.11.2006, 06:13 | #10 |
Павел Сергеевич
Форумчанин
Регистрация: 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... |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разделить дату на год,месяц, день | 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 |