Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 347

/ вопрос открыт /

Здравствуйте все!!! Если не сложно поскажите плисс...
Нужно сделать следующее
g:=t div 60;
только проблема в том, что t есть не "integer", а "real".

...или как просто от числа откинуть все после комы (например, есть число 3,75, а сделать из него просто 3).
Но чтобы при этом оно не округлилось, а просто откинулся "хвостик"...

Pokemonchyk Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Pokemonchyk (статус: Посетитель)
Вопрос отправлен: 24 февраля 2007, 18:07
Состояние вопроса: открыт, ответов: 5.

Ответ #1. Отвечает эксперт: Евгений Козаченко

Приветствую!
Используйте функцию trunc(x). Она усекает дробное часть.

Приложение:
  1.  
  2. var
  3. r: real;
  4. i: integer;
  5. begin
  6. i:= trunc(r);
  7. end;


Ответ отправил: Евгений Козаченко (статус: 2-ой класс)
Время отправки: 24 февраля 2007, 19:11
Оценка за ответ: 3

Ответ #2. Отвечает эксперт: Aymenel

Здравствуйте, Pokemonchyk!
Есть еще функция Int.
function Int(X: Extended):Extended - Возвращает целую часть параметра X.

Ответ отправил: Aymenel (статус: 2-ой класс)
Время отправки: 24 февраля 2007, 20:26
Оценка за ответ: 4

Ответ #3. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Pokemonchyk!

В делфях есть очень хороший тип Variant. Можно сделать так.

var
t: Variant;
g: integer;
begin
t:=60.5678;
g:=t div 60
ShowMessage(IntToStr(q));
end;

Удачи!

Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 24 февраля 2007, 21:04
Оценка за ответ: 4

Ответ #4. Отвечает эксперт: Вадим К

Вариант с trunc правильный, но не самый быстрый. По моим тестам Round(Int(x)) на 30-40% быстрей.

Вариант с int, предложеный Федоров Роман Сергеевич не подходит, так как он возвращает вещественное число, которое соответственно не может участвовать в операции div.

Вариант с Variant тоже хорош, но нет гарантии, что Делфи всегда будет откидать дробную часть правильно.

Также хочу заметить, что в случае отрицательных чисел есть два варианта отбрасывания дробной части и для них есть свои функции
Как они отличаются - обясняю на примере
Ceil(-2.8) = -2//вправо по оси Х
Ceil(2.8) = 3
Ceil(-1.0) = -1

Floor(-2.8) = -3//влево по оси Х
Floor(2.8) = 2
Floor(-1.0) = -1

Trunc(-2.8) = -2//к нулю
Floor(2.8) = 2
Floor(-1.0) = -1
Но все они возвращают вещественное число, и вам нужно будет функция Round

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 24 февраля 2007, 23:39
Оценка за ответ: 5

Ответ #5. Отвечает эксперт: Шарайчук Сергей Олександрович

Попробуй так, роботает 100 процентов!!!!

Приложение:
  1. vat i,r:integer;
  2. s,a:string;
  3. t:real;
  4. begin
  5.  
  6. i:=1;
  7. a:='';
  8. while (s[i]<>'.')or(s[i]<>',') do
  9. begin
  10.  
  11. i:=i+1;
  12. end;
  13.  
  14. end;


Ответ отправил: Шарайчук Сергей Олександрович (статус: 2-ой класс)
Время отправки: 26 февраля 2007, 21:23


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 26 февраля 2007, 02:38; участников в обсуждении: 4.
Denisss

Denisss (статус: 2-ой класс), 24 февраля 2007, 21:46 [#1]:

g:=trunc(t) div 60;
Alex Van Glukhman

Alex Van Glukhman (статус: 7-ой класс), 25 февраля 2007, 15:32 [#2]:

To Вадим К
Вариант с Variant тоже хорош, но нет гарантии, что Делфи всегда будет откидать дробную часть правильно.
Не согласен. Тип Variant введён специально для совместимости с другими типами Delphi. И чего чего, а этот тип отработан Borland великолепно.
В задаче стоит откинуть знаки после запятой, а не округлять число. Поэтому железно работает Float to Integer
Вадим К

Вадим К (статус: Академик), 25 февраля 2007, 19:02 [#3]:

>>В задаче стоит откинуть знаки после запятой
Посмотрите внимательно мой ответ, и вы поймёте, что есть два способа отбрасывать дробную часть для отрицательных чисел.
Во вторых для div нужно целое число. А для преобразования вещественного в целое есть только один способ - округление. Остальные методы так или иначе используют округление. Вы должны знать, что 2.0 (вещественное) никогда неравно 2 (целое)
Галочка "подтверждения прочтения" - вселенское зло.
Pokemonchyk

Pokemonchyk (статус: Посетитель), 25 февраля 2007, 21:17 [#4]:

Спасибо всем, кто ответил.
Если чесно мне не нужно здесь очень большой точности или скорости выполнения.
Попробовал первый ответ. Он бы меня устроил, но вот беда если функция trunc(x) видит целое число(а вернее real только без крапки) то она Уменьшает его на единицу. :(

остальные ответы буду проверять.вы прям засыпали меня версиями ответов :)
Alex Van Glukhman

Alex Van Glukhman (статус: 7-ой класс), 25 февраля 2007, 22:50 [#5]:

To Вадим К. Рекомендую почитать Тейксейра и Пачеко - тип Variant
Denisss

Denisss (статус: 2-ой класс), 25 февраля 2007, 23:19 [#6]:

Вадим К писал:
> но вот беда если функция trunc(x) видит целое число(а вернее real только без крапки) то она Уменьшает его на единицу. :(

Так в чем проблема? Сделайте так, чтобы это "целое число" превратилось в нецелое. Добавьте к нему, например, 0.000001 и оно уже не будет целым. Если, например, у Вас будет число 1.999999, то после такого добавления оно превратится в 2, а после округления вновь в 1.
Вадим К

Вадим К (статус: Академик), 25 февраля 2007, 23:34 [#7]:

То Alex Van Glukhman. Не совсем понял вашего замечания. С типом variant знаком. Также я знаю, что преобразования с этим типом осуществляются посредством Round(); - это показывает изучение исходного кода функции _VarToInteger в файле Variants. (покрайней мере, в моей, 2006 делфи) Так что она не отбрасывает дробную часть, а округляет. Разницу чувствуете? Специально достал книгу Ксавье Пачеко, где написано тоже - округляет.
Если неверите, попробуйте следующий код
var v:Variant;
i:integer;
begin
v:=2.8;
i:=v;
ShowMessage(Inttostr(i));

Если он бы отбрасывал, то возвращалось бы 2. Если округляет - 3
Галочка "подтверждения прочтения" - вселенское зло.
Pokemonchyk

Pokemonchyk (статус: Посетитель), 26 февраля 2007, 02:38 [#8]:

to Denisss:
я не знаю какое число будет. меня устраивает trunc(x). Не устраивает только тогда, когда число превращается в целое.
Вот [b]если бы как то проверить целое число или нет[/b], то я бы мог просто приплюсовать единицу при всех целых числах...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:37
Выполнено за 0.02 сек.