![]() |
|
|
![]()
|
|
| santey |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 31.12.2005 Репутация: -1 Всего: -1 |
Имеются 3 величины, которые в сумме составляют 100 процентов
первая - 1000 вторая - 38 третья - 20 необходимо точно вычислить какой процент составляет каждая величина от общей суммы. для этого сложим 3 суммы и умножим на 0.01 и получим величину одного процента, которая равна 10.58, далее каждую величину разделим на один процент и получим первая - 94.5179 вторая - 3.5916 третья - 1.8903 так вот как эти величины правильно округлить так, чтобы получились правильные значения в процентах переменной в int? Если округлять вверх то получится первая - 95% вторая - 4% третья - 2% здесь 95+4+2=101% неправильно Если округлять вниз то получится первая - 94% вторая - 3% третья - 1% здесь 94+3+1=98% тоже неправильно Может быть имеются функции выделяющие правильный процент из определенной величины? Это сообщение отредактировал(а) santey - 20.9.2010, 22:52 |
|||
|
||||
| ИванМ |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 5 Всего: 23 |
Вычислить то, что на самом деле, потом понизить ту величину, у которой дробная часть самая маленькая.
Нет такой функции |
||||
|
|||||
| casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: нет Всего: 2 |
Я бы так сделал:
Округлить все числа вверх. Если в сумме 102 - 2 числа с наименьшей дробной частью округлять вниз, оставшееся вверх. если в сумме 101 - 1 число с наименьшей дробной часть округлять вниз , оставшиеся 2 вверх. если в сумме 100 - все числа округлять вверх (или вниз как нравится - потому что 100 получится только когда все числа целые) |
|||
|
||||
| t4aynik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 5.6.2010 Репутация: нет Всего: нет |
100*1000/(1000+38+20)=~95%
(100-95)*38/(38+20)=~3% 100-95-3=2% то что с ~ округляй как хочешь. так не пойдет? Это сообщение отредактировал(а) t4aynik - 23.9.2010, 16:34 |
|||
|
||||
| santey |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 31.12.2005 Репутация: -1 Всего: -1 |
Конечно не пойдет. А как узнать в какую сторону округлять? в большую или меньшую. Имею в виду первое число ~95 |
|||
|
||||
| santey |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 31.12.2005 Репутация: -1 Всего: -1 |
||||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 5 Всего: 23 |
Вот что пока получилось. Страшно, ужасно и коряво, но вроде работает.
|
|||
|
||||
| t4aynik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 5.6.2010 Репутация: нет Всего: нет |
||||
|
||||
| santey |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 31.12.2005 Репутация: -1 Всего: -1 |
Все варианты перебрал и либо громоздкая функция, вычисляющая целые проценты или же очень простая но дающая 100 процентные проценты это double с одним значением после запятой.
Например, для своей программы сделал double TFormMain::Procent(int S[3],int number) { //определяем процент значения number double pr_number=(double)S[number]/((S[0]+S[1]+S[2])*0.01); //отделяем дробную часть и переводим в целое число int a=Frac(pr_number)*1000; //отделяем по значению и округляем его, если надо for(int i=0;i<2;i++) a=a/10+(fmod(a,10)>5 ? 1 : 0); //возвращаем полученный результат return floor(pr_number)+a*0.1; } Это сообщение отредактировал(а) santey - 24.9.2010, 22:26 |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |