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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2011, 20:33   #1
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию выделить дробную часть числа

Код:
var
  c, d: real; 
  i, k, d2: integer; 
  s, s1: string; 


begin
  readln(c); 
  d := frac(c);
  s:=''; 
  if d <> 0 then begin
    while d <= 1 do 
    begin
      inc(k); 
      d := d * 10; 
    end;    
    for i := 1 to k - 1 do 
      s := s + '0'; 
    while frac(d) <> 0 do
      d := d * 10;
    str(trunc(d), s1); 
    s := s + s1; 
  end; 
  writeln(s); 
end.
вот написал такой код...
на ABC работает только когда число без целой части, напр 0.0304

если ввести 1.0304 выдает ошибку...
похоже потому что криво дробную часть возвращает

1.020032
0.0200320000000001

что-то я понять не могу))
unbanned вне форума Ответить с цитированием
Старый 18.06.2011, 20:37   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
var c:real;
s:string;
begin
c:=1.0303;
str(c,s);
delete(s,1,pos('.',s));
writeln(s);
end.
результат
Цитата:
0303
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 18.06.2011, 20:41   #3
Leo08
Delphi master
Пользователь
 
Аватар для Leo08
 
Регистрация: 28.05.2011
Сообщений: 96
По умолчанию

Можно и по-другому:
Код:
Function a(i:real):real;
Begin
Result:=i-trunc(i):
End;
БЯЯЯГГАААААА
Leo08 вне форума Ответить с цитированием
Старый 18.06.2011, 20:45   #4
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
Код:
var c:real;
s:string;
begin
c:=1.0303;
str(c,s);
delete(s,1,pos('.',s));
writeln(s);
end.
результат
да, да))) и так писал... только если в turbo запустить то получится что-то типо 030300000+E00
unbanned вне форума Ответить с цитированием
Старый 18.06.2011, 20:46   #5
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

можно еще проще )
Код:
 Function Frac(X : Real) : Real;
Цитата:
Возвращает дробную часть аргумента.
Объявление
Параметр X - выражение вещественного типа. Результат - дробная часть X, то есть Frac(X) = X-Int(X).
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 18.06.2011, 20:47   #6
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от Leo08 Посмотреть сообщение
Можно и по-другому:
Код:
Function a(i:real):real;
Begin
Result:=i-trunc(i):
End;
1.0303
должно быть 0303, а не 0.0303
unbanned вне форума Ответить с цитированием
Старый 18.06.2011, 20:51   #7
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

пробуйте)
Код:
var c:real;
n:integer;sc:set of char;
s:string;
begin
readln(c);
str(c:0:100,s);
delete(s,1,pos('.',s));
n:=length(s);
sc:=['0','E','+','-'];
while s[n] in sc do
begin
delete(s,n,1);
n:=n-1;
end;
writeln(s);
readln;
end.
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 18.06.2011 в 20:59.
Mad_Cat вне форума Ответить с цитированием
Старый 18.06.2011, 21:09   #8
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
пробуйте)
хах)) можно было догадаться... спасибо
unbanned вне форума Ответить с цитированием
Старый 18.06.2011, 21:15   #9
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

и всё-таки... почему дробную часть возвращает таким образом?)))

1.020032
0.0200320000000001

откуда эта единица?
unbanned вне форума Ответить с цитированием
Старый 18.06.2011, 21:27   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А потому что процессор не умеет точно считать дробные. И округление будет глючить как бы ты не старался ловить точность.
А что за задача заставила тебя так напрячься?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать дробную часть prod87 Общие вопросы Delphi 6 15.06.2010 06:57
полностью убрать дробную часть числа Rainz Паскаль, Turbo Pascal, PascalABC.NET 23 02.06.2010 19:17
отделить дробную часть от числа |v||v|<<IpShot Общие вопросы C/C++ 19 24.09.2008 18:21
подскажите какая процедура округляет дробные числа , а не откидывает дробную часть, к ***СкаЙ*** Помощь студентам 5 13.06.2007 16:03
Как выделить целую часть из числа? Slash Общие вопросы Delphi 3 11.05.2007 00:53