| 
| 
 | Вопрос # 347/ вопрос открыт / | 
 |  Здравствуйте все!!! Если не сложно поскажите плисс...Нужно сделать следующее
 g:=t div 60;
 только проблема в том, что t есть не "integer", а "real".
 
 ...или как просто от числа откинуть все после комы (например, есть число 3,75, а сделать из него просто 3).
 Но чтобы при этом оно не округлилось, а просто откинулся "хвостик"...
 
|  |   Вопрос задал: Pokemonchyk (статус: Посетитель)Вопрос отправлен: 24 февраля 2007, 18:07
 Состояние вопроса: открыт, ответов: 5.
 |  Ответ #1. Отвечает эксперт: Евгений Козаченко Приветствую!Используйте функцию trunc(x). Она усекает дробное часть.
 
|  | Ответ отправил: Евгений Козаченко (статус: 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 процентов!!!! Приложение:Переключить в обычный режим vat i,r:integer;    s,a:string;    t:real;begin i:=1;a:='';while (s[i]<>'.')or(s[i]<>',') dobegin i:=i+1;end; end;
 Мини-форум вопросаВсего сообщений: 8; последнее сообщение — 26 февраля 2007, 02:38; участников в обсуждении: 4. 
|   | Denisss (статус: 2-ой класс), 24 февраля 2007, 21:46 [#1]:g:=trunc(t) div 60; |  
|   | 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 (целое)
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Alex Van Glukhman (статус: 7-ой класс), 25 февраля 2007, 22:50 [#5]:To Вадим К. Рекомендую почитать Тейксейра и Пачеко - тип Variant |  
|   | 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 (статус: Посетитель), 26 февраля 2007, 02:38 [#8]:to Denisss: я не знаю какое число будет. меня устраивает trunc(x). Не устраивает только тогда, когда число превращается в целое.
 Вот [b]если бы как то проверить целое число или нет[/b], то я бы мог просто приплюсовать единицу при всех целых числах...
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |