Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Округление


zorik ©   (2004-10-13 09:59:00) 

Здраствуте мастера!
Вопрос в следующем. Имеется масив чисел с плавающей точкой и сума этих чисел - целое число. Нужно округлить значения чисел до целых, так чтоб сума равнялась прежней.
Например:

до округления:   1.6+5.6+2.8=10
псле округления  2  +6  +3  =11

10 не равно 11 :-(

Может есть какие-то идеи?


ЮЮ   (2004-10-13 11:01:00) [1]

r[] - массив "весов"  q[i]/sum(q[i])

//sum = sum(q[i])
sumR := 0;
sumRound := 0;
for i := 0 to ... do begin
qRound[i] := Round((sumR + r[i]) * sum) - sumRound;
Inc(sumRound, qRound[i]);
sumR := sumR + r[i];  
end;

это, по моему, позволит не накапливаться ошибке


zorik   (2004-10-13 10:55:00) [2]

>S-iS может принимать значения -1, 0, 1

s-is может принимать и -2 и -3 и +2 и +3 и ... :-)


zorik   (2004-10-13 10:46:00) [3]

to kolan>
Если много елементов - последний должен отвечать за все, а если он найменший. Можно правда максимальный найти и к нему добавлять (отнимать). А можно чило, равное разнице сум, максимальных елементов и к ним подобавлять (поотнимать) по единичке


Verg   (2004-10-13 10:37:00) [4]

a  - массив вещ. чисел
ia - массив округленных целых
S = round(sum(a));
iS = sum(ia);

S-iS может принимать значения -1, 0, 1
if S < iS
{
 // это значит, что хотя бы один элемент a был округлен в большую сторону
 находим серди a[i] с минимальнымfrac(a[i]) > 0.5
 уменшаем соотв. элемент ia на единицу ia[i]--;
}
else
{
 // это значит, что хотя бы один элемент a был округлен в меньшую сторону
 находим серди a[i] с максимальнымfrac(a[i]) <= 0.5
 увеличиваем соотв. элемент ia на единицу ia[i]++;
}


Verg   (2004-10-13 10:36:00) [5]

a  - массив вещ. чисел
ia - массив округленных целых
S = round(sum(a));
iS = sum(ia);

S-iS может принимать значения -1, 0, 1
if S < iS
{
 // это значит, что хотя бы один элемент a был округлен в большую сторону
 находим серди a[i] с максимальным frac(a[i]) > 0.5
 уменшаем соотв. элемент ia на единицу ia[i]--;
}
else
{
 // это значит, что хотя бы один элемент a был округлен в меньшую сторону
 находим серди a[i] с минимальным frac(a[i]) <= 0.5
 увеличиваем соотв. элемент ia на единицу ia[i]++;
}


Kolan   (2004-10-13 10:25:00) [6]

Ну не понл
> Потом каждый элемент умножается на этот коэфициент и округляется
> до целого
ну и пусть округляется...
Зачем тогда чтоб суммы совпадали
да и чем мой вариант не подходит
Можно еше ввести проверку и допустим  элементы > *.7 не округлять в меньшую. А < *.4 в больщую


ЮЮ   (2004-10-13 10:20:00) [7]

>Элементов около 300
>и округляется до целого

значит как минимум 200 элементов должны быть равны 0, даже если что-то показывали? И как тогда их отличмть от тех, что действительно были нулевыми?


zorik   (2004-10-13 10:16:00) [8]

Это будет неправильно! Элементов около 300 ы последний может нулю быть равным. Чтоб было все ясно объясню. элементы масива - это значения измерений приборов за единицу времени [q[i]] (например сутки), а сума - это общий показатель по всем приборам [q_fact] (например за месяц). Сначала находится коэфициент пересчета как

  k=q_fakt/sum(q[i])

Потом каждый элемент умножается на этот коэфициент и округляется до целого.


Kolan   (2004-10-13 10:08:00) [9]

Можно самому делать например: Округлил все в большую
2  +6  +3  =11 11<>10
след шаг первое округлил в меньшее остальные вверх
1+6+3=10 10=10 OK
Ну итд но тут комбинаций верных может быть много сам понимаешь как нужную выбрать ?
PS 2+5+3=10


Sandman25   (2004-10-13 10:05:00) [10]

Последний элемент находить как разность.


Наверх

Титульная страница Поиск, карта сайта Написать письмо