Guest |
Отправлено: 19.08.2004, 11:25 |
|
Не зарегистрирован
|
Есть число double d;
которое может быть 47.538, 98.724, 63.22, 72.437, 13.86 то есть любым.
Как можно его округлить с точностью до 0.5
( чтобы было соответственно 47.5, 98.5, 63, 72.5, 14 ) ???
|
|
Konstantine |
Отправлено: 19.08.2004, 11:42 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
а зачем тебе дабл? бери инт и прийми его как 2*х, (т.е. в расчётах дели ещё на два) а для вывода на экран — ((double)х/2) этим уберёшь кучу погрешностей в расчётах и сэкономишь процессорное время
|
|
Guest |
Отправлено: 19.08.2004, 11:48 |
|
Не зарегистрирован
|
Потому что это число уже double — точка на графике, где
находится курсор, и она уже имеет этот формат
double tmpX, tmpY;
LineSeries->GetCursorValues(tmpX, tmpY);
нужно выровнять ее с точностью до 0.5
Кто знает, как это лучше сделать ???
|
|
Konstantine |
Отправлено: 19.08.2004, 11:59 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
умножь на 2 , округли и дели на 2
|
|
Guest |
Отправлено: 19.08.2004, 14:45 |
|
Не зарегистрирован
|
Спасибо, попробую. |
|
Guest |
Отправлено: 19.08.2004, 14:55 |
|
Не зарегистрирован
|
Я так понял, надо делать вот так:
CODE |
tmpY = (int((tmpY*2.+0.5)))/2.;
| |
|
Konstantine |
Отправлено: 19.08.2004, 15:06 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
если int округляет оставляя даблом (не помню просто) то
tmpY = (int(tmpY*2))/2.;
|
|
Doga |
Отправлено: 19.08.2004, 19:58 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Позвольте мне, Уважаемые Коллеги, скромненько так Вам напомнить, что при переводе типа double в int, значение отнюдь не округляется, а просто отбрасывается дробная часть:
(int)13.16 = 13;
int(13.86) = 13;
|
|
Gedeon |
Отправлено: 19.08.2004, 20:27 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
BCB6 Math.hpp
CODE |
extern PACKAGE double __fastcall RoundTo(const double AValue, const TRoundToRange ADigit); |
|
|
Konstantine |
Отправлено: 20.08.2004, 09:15 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
QUOTE (Doga @ 19/08/2004, 21:00) | Позвольте мне, Уважаемые Коллеги, скромненько так Вам напомнить, что при переводе типа double в int, значение отнюдь не округляется, а просто отбрасывается дробная часть
|
может такое и есть (не сталкивался и не проверял) но я так считаю, что в данной ситуации — округлить график с большим разбросом значений — этим можно пренебречь, хотя всё зависит от ситуации, которую представляет себе разработчик (в данном случае так и не назвавшийся)
А подключение лишних библиотек ведёт к увеличению кода и к нецелесообразной загрузке процессора (если не нужна такая точность, например)
|
|
Boyko |
Отправлено: 20.08.2004, 09:56 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 88
|
Все таки система десетичная....
tmpx+=0.05;
tmpx*=10;
int intx=(int) tmpx;
tmpx=(double) intx;
tmpx/=10;
|
|
Konstantine |
Отправлено: 20.08.2004, 10:06 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
QUOTE (Boyko @ 20/08/2004, 10:58) | Все таки система десетичная....
tmpx+=0.05;
|
может 0.5 ? тогда и так можно
Отредактировано Konstantine — 20/08/2004, 11:09
|
|
Boyko |
Отправлено: 20.08.2004, 14:46 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 88
|
QUOTE (Konstantine @ 20/08/2004, 11:08) | QUOTE (Boyko @ 20/08/2004, 10:58) | Все таки система десетичная....
tmpx+=0.05;
|
может 0.5 ? тогда и так можно |
Если 0.5 тогда надо
tmpx*=10;
tmpx+=0.5;
... |
|
Konstantine |
Отправлено: 20.08.2004, 14:54 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
в задании-то до 0.5, а не до 0.05, насколько Я понял — ты округлил до 0.05
|
|
Boyko |
Отправлено: 20.08.2004, 15:07 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 88
|
QUOTE (Guest @ 19/08/2004, 15:57) | Я так понял, надо делать вот так:
CODE |
tmpY = (int((tmpY*2.+0.5)))/2.;
|
|
Ай, ай, я ошибку сделал, другое условие понял... Думаю что Guest правильно делает... |
|
Konstantine |
Отправлено: 20.08.2004, 15:16 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
а да ... точно, я там чё-то сразу не сообразил зачем 0.5.... а так да — правильно
|
|
Boyko |
Отправлено: 20.08.2004, 15:18 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 88
|
QUOTE (Konstantine @ 20/08/2004, 15:56) | в задании-то до 0.5, а не до 0.05, насколько Я понял — ты округлил до 0.05 |
Konstantine, правильно понял то что Я сделал.
В задании НАПИСАНО что до 0.5
А округление до 0.25!!!!!!!!!!!!!!
|
|
DarkStar |
Отправлено: 03.10.2004, 17:01 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 20
|
Может быть еще понадобиться кому.
Я такую задачу решал двумя способами.
1. Сначало использовал функцию sprintf(.., "%.1f", ...)
2. Нашел функцию RoundTo(..., -1); #include Math.hpp |
|
avtoritet |
Отправлено: 04.10.2004, 04:43 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 15
|
Ну и тему раздули! Читаю, ничего не понимаю! Правильное решение нашли или нет?
На мой взгляд не так искали. Я знаю как округлять подобного рода числа. Кого -нибудь это еще интересует? |
|
Konstantine |
Отправлено: 04.10.2004, 10:56 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
QUOTE (DarkStar @ 03/10/2004, 18:03) | Может быть еще понадобиться кому.
Я такую задачу решал двумя способами.
1. Сначало использовал функцию sprintf(.., "%.1f", ...)
2. Нашел функцию RoundTo(..., -1); #include Math.hpp |
зачем такие функции если можно обойтись простейшими операциями.
пожалей камень — он ведь не резиновый
|
|
Boyko |
Отправлено: 05.10.2004, 15:54 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 88
|
QUOTE (avtoritet @ 04/10/2004, 04:45) | Ну и тему раздули! Читаю, ничего не понимаю! Правильное решение нашли или нет?
|
Нашли:
QUOTE (Guest @ 19/08/2004, 14:57) | Я так понял, надо делать вот так:
CODE |
tmpY = (int((tmpY*2.+0.5)))/2.;
|
|
QUOTE (avtoritet @ 04/10/2004, 04:45) | На мой взгляд не так искали. Я знаю как округлять подобного рода числа. Кого -нибудь это еще интересует?
|
Дело в том что тема не "Как округлить число с точностью до 0.5?", а "Как округлить число до 0.0, 0.5, 1.0, 1.5, 2.0,... с точностью до 0.25?"
|
|
AVC |
Отправлено: 05.10.2004, 17:12 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Почему-то получилось два ответа
Отредактировано AVC — 05/10/2004, 17:17 |
|
AVC |
Отправлено: 05.10.2004, 17:14 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Можно вставить свои 5коп?
Писано х знает сколько лет назад (еще в эпоху Clipper'а)
переаботка для Builder'а на скорую руку.
CODE |
PACKAGE double __fastcall AxRound (double val, double krt)
//Округление Val до кратности Krt
{
if (val == 0 || krt == 0) return val;
__int64 ival;
double ost;
int znak = 1;
if (val < 0) { znak = (-1); val = -val; }
if (krt < 0) krt = -krt;
ival = __int64(val / krt);
ost = val — ival * krt;
if (ost >= (krt / 2)) ival ++;
return double(ival) * krt * znak;
}
/*
AxRound( 1.000, 0.3) = 0.900
AxRound( 1.100, 0.3) = 1.200
AxRound( 1.200, 0.3) = 1.200
AxRound( 1.300, 0.3) = 1.200
AxRound( 1.340, 0.3) = 1.200
AxRound( 1.350, 0.3) = 1.500
AxRound( 1.400, 0.3) = 1.500
AxRound(-1.000, 0.3) = -0.900
*/
| |
|
DarkStar |
Отправлено: 05.10.2004, 18:09 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 20
|
Konstantine опять скажет что ты бессердечен к камню |
|
Konstantine |
Отправлено: 06.10.2004, 08:47 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
Точно!!! зачем городить огород, если подобные округления если и нужна делать из многих мест программы, то обычно с одним-двумя коэф. округления.. для этого можно написать свои высокопроизводительные функции.
Люди-программеры... не делайте простых операций сложными методами... (никто не пробовал найти 1 элемент из массива в 10000 в visual basic стандартным перебором — я так понял это для него самая сложная задача) всё можно сделать быстрее и не всегда в ущерб простоте...
ну вот например... кто из вас множит на 2 след методом: анологично можно и на 4,8 и т.д.
я не говорю о том что делать самим более эффективные компоненты, их универсальность опять вылезет боком.
Но в данной ситуации (если в проге одинаковая кратность округления) лучше всего создать ориентированную только на эту кратность функцию. для этого Я вижу токо один метод из предложеных:CODE | tmpY = (int((tmpY*2.+0.5)))/2 |
кстати... чем меньше используете библиотек — тем меньше размер кода исп. проги и быстрее компилится!
Отредактировано Konstantine — 06/10/2004, 09:50
|
|