![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Округление
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]Последний элемент находить как разность.