C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как лучше округлить число до 0,5
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 опять скажет что ты бессердечен к камню smile.gif
Konstantine
  Отправлено: 06.10.2004, 08:47


Мастер участка

Группа: Модератор
Сообщений: 545



Точно!!! зачем городить огород, если подобные округления если и нужна делать из многих мест программы, то обычно с одним-двумя коэф. округления.. для этого можно написать свои высокопроизводительные функции.

Люди-программеры... не делайте простых операций сложными методами... (никто не пробовал найти 1 элемент из массива в 10000 в visual basic стандартным перебором — я так понял это для него самая сложная задача) всё можно сделать быстрее и не всегда в ущерб простоте...

ну вот например... кто из вас множит на 2 след методом:
CODE
a=a<<1
анологично можно и на 4,8 и т.д.

я не говорю о том что делать самим более эффективные компоненты, их универсальность опять вылезет боком.

Но в данной ситуации (если в проге одинаковая кратность округления) лучше всего создать ориентированную только на эту кратность функцию. для этого Я вижу токо один метод из предложеных:
CODE
tmpY = (int((tmpY*2.+0.5)))/2

кстати... чем меньше используете библиотек — тем меньше размер кода исп. проги и быстрее компилится!

Отредактировано Konstantine — 06/10/2004, 09:50

Вернуться в Вопросы программирования в C++Builder