|
Алгоритм размазывания суммы ХХХХ по ТЧ документа | ☑ | ||
---|---|---|---|---|
0
lamme
24.08.16
✎
10:52
|
Вот такой вот алгоритм есть.
На больших ТЧ и больших суммах - разница очень хорошая получается. Например, при сумме ТЧ = 1 000 000 и сумме ХХХ = 34000. Разница после размазывания получаается в 500р. Это много. Есть другие алгоритмы ? для каждого ЭлТ из Товары цикл Доля = ЭлТ.Сумма/Товары.Итог("Сумма"); ЭлТ.Сумма=ЭлТ.Сумма + Доля*СуммаДопРасходов; ЭлТ.Цена =ЭлТ.Сумма/ЭлТ.Количество; конеццикла; |
|||
1
lamme
24.08.16
✎
10:52
|
ХХХ = СуммаДопРасходов
|
|||
2
DailyLookingOnA Sunse
24.08.16
✎
10:55
|
Что, так в каждой строке цикла и считается Товары.Итог("Сумма") ?
;-))))) |
|||
3
lamme
24.08.16
✎
10:56
|
djn ,kz !
|
|||
4
lamme
24.08.16
✎
10:56
|
вот блин!
точно ... |
|||
5
Масянька
24.08.16
✎
10:56
|
(0) У меня так:
гТабВыборка.ВыбратьСтроки(); Пока гТабВыборка.ПолучитьСтроку() = 1 Цикл мРасчет = (СуммаТР * гТабВыборка.СуммаОбщая) / ЧислоИтог; гТабВыборка.СуммаДоставки = мРасчет; КонецЦикла; Семерка. |
|||
6
patria0muerte
24.08.16
✎
10:57
|
В типовых есть метод:
Функция РаспределитьПропорционально(Знач ИсхСумма, МассивКоэф, Знач Точность = 2, ПроверкаНулевыхЗначений=Истина) Экспорт Если МассивКоэф.Количество() = 0 Или (ПроверкаНулевыхЗначений И ИсхСумма = 0) Или ИсхСумма = Null Тогда Возврат Неопределено; КонецЕсли; // Массив коэффициентов необходимо упорядочить, поэтому создадим таблицу для распределения УпорядоченнаяТаблица = Новый ТаблицаЗначений; УпорядоченнаяТаблица.Колонки.Добавить("Коэф", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(17,4))); УпорядоченнаяТаблица.Колонки.Добавить("ИсходныйИндекс", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,0))); СуммаКоэф = 0; Для К = 0 По МассивКоэф.Количество() - 1 Цикл СуммаКоэф = СуммаКоэф + МассивКоэф[К]; СтрокаТаблицы = УпорядоченнаяТаблица.Добавить(); СтрокаТаблицы.Коэф = МассивКоэф[К]; СтрокаТаблицы.ИсходныйИндекс = К; КонецЦикла; Если СуммаКоэф = 0 Тогда Возврат Неопределено; КонецЕсли; УпорядоченнаяТаблица.Сортировать("Коэф Убыв"); МассивСумм = Новый Массив(УпорядоченнаяТаблица.Количество()); Для каждого СтрокаТаблицы Из УпорядоченнаяТаблица Цикл // Возвращаемый результат должен быть в том же порядке МассивСумм[СтрокаТаблицы.ИсходныйИндекс] = ?(СуммаКоэф <> 0, Окр(ИсхСумма * МассивКоэф[СтрокаТаблицы.ИсходныйИндекс] / СуммаКоэф, Точность, 1), 0); ИсхСумма = ИсхСумма - МассивСумм[СтрокаТаблицы.ИсходныйИндекс]; СуммаКоэф = СуммаКоэф - МассивКоэф[СтрокаТаблицы.ИсходныйИндекс]; КонецЦикла; Возврат МассивСумм; КонецФункции // РаспределитьПропорционально() |
|||
7
Это_mike
24.08.16
✎
10:58
|
[:||||:]
|
|||
8
Ёпрст
24.08.16
✎
11:08
|
Вообще то, правильнее распределять рандомом.
|
|||
9
Fragster
гуру
24.08.16
✎
11:11
|
База = Товары.Итог("Сумма");
для каждого ЭлТ из Товары цикл Доля = ЭлТ.Сумма/База; База = База - ЭлТ.Сумма; ПредСумма = ЭлТ.Сумма; ЭлТ.Сумма=ЭлТ.Сумма + Доля*СуммаДопРасходов; СуммаДопРасходов = СуммаДопРасходов - ЭлТ.Сумма + ПредСумма; ЭлТ.Цена =ЭлТ.Сумма/ЭлТ.Количество; конеццикла; |
|||
10
RomanYS
24.08.16
✎
11:15
|
(9) у такого способа есть один минус: он вылетит на базе, например, {1, -1, 1}.
Хотя для допрасходов пойдет, там такого обычно не бывает. |
|||
11
hitodom
24.08.16
✎
11:19
|
лучше после каждой строки уменьшать базу, тогда не будет ошибок округления
|
|||
12
RomanYS
24.08.16
✎
11:41
|
(11) Если есть округление - есть и ошибки округления. А не будет - остатка, который мог образоваться из-за накопления ошибок округления. Наверное, я к терминологии придираюсь.
Но это не отменяет ошибку деления на 0 из (10). |
|||
13
hitodom
24.08.16
✎
11:42
|
(12) а как ты по отрицательной базе собрался распределеять?
|
|||
14
AlexTim03
24.08.16
✎
11:48
|
Уже 100500 раз решалась эта задача.
На каждом проходе уменьшаешь базу распределения и количество. Ошибок округления не будет. На i...одном известном ресурсе приводились примеры решения такой задачи. Даже есть решение через запрос. |
|||
15
RomanYS
24.08.16
✎
12:01
|
(13) распределить 100 по базе {1, -1, 1}. Ответ {100, -100, 100}, совершенно однозначный с точки зрения математики.
|
|||
16
RomanYS
24.08.16
✎
12:08
|
(14) прочитай (12)
http://dic.academic.ru/dic.nsf/bse/117736 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |