|
Вопрос # 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]<>',') do
- begin
-
- 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], то я бы мог просто приплюсовать единицу при всех целых числах...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|