Как пропорционально распределить сумму ? #551801


#0 by Ткачев
Подскажите формулу. Есть 3 суммы 150, 100 и 50, как 100 разделить пропорционально между 150 и 50.
#1 by VladZ
Пропорционально.
#2 by VladZ
75 и 25
#3 by Ткачев
А формулой ?
#4 by VladZ
1. Вычисляем, во сколько раз отличается 100 от суммы 150 и 50. 100/(150+50) = 0,5 2. Умножаем наши суммы на полученный к-т. 150 * 0,5 = 75 50 * 0,5 = 25
#5 by Rie
100/(150+50)
#6 by Нуф-Нуф
100 * 50 / (50+100+150) 100 * 100 / (50+100+150) 100 * 150 / (50+100+150)
#7 by Нуф-Нуф
блин (50+100+150) заменить на (50+150)
#8 by Ткачев
Формулой это типа: Ч1 = 150 Ч2 = 100 Ч3 = 50 Сумма = Ч2 / (Ч1 + Ч3) Ч1 = Ч1 + Ч1 * Сумма Ч3 = Ч3 + Ч3 * Сумма Все понятно, всем спасибо.
#9 by VladZ
Чтобы не путаться в понятиях: Коэффициент = Ч2 / (Ч1 + Ч3) Ч1 = Ч1 + Ч1 * Коэффициент Ч3 = Ч3 + Ч3 * Коэффициент
#10 by VladZ
А зачем так: Ч1 = Ч1 + Ч1 * Коэффициент ?
#11 by Рэйв
Функция РассчитатьДельту(СуммаВходящая,ВсегоСуммаВходящая,СуммаРаспределения)    ПроцентОтОбщей=СуммаВходящая /(ВсегоСуммаВходящая/100);    Дельта=Окр(СуммаРаспределения/100*ПроцентОтОбщей,2,РежимОкругления.Окр15как20);    Возврат Дельта; КонецФункции
#12 by Рэйв
+ потом если последняя сумма надо не функцию вызывать а тупо прибавлять оставшийся хвост.  а то копейки остаются
#13 by andrewks
мдэ... а что, в Советское время тоже образование хромало?
#14 by Humandra
хвост в виде лишней копейки, если коэффициент вида 0,3333333333333, лучше не к последней сумме прибавлять, а к максимальной. Аккуратнее получается. :)
#15 by rs_trade
"программист"-гуманитарий?
#16 by DES
это шутка ?
#17 by Рэйв
Можно и так :-)
#18 by DES
есть 2 (два) осажденных города. в одном 150 защитников. в другом 50 защитников. им на подмогу идет обоз с мукой. везут 100 кг. Задача: сколько муки нужно завезти в каждый город через подземный ход чтобы всем защитникам досталось поровну? Решение: Складываем всех защитников города, делим всю муку на кол-во всех защитников, находим сколько муки приходится на 1 защитника по норме. Умножаем норму на кол-во защитников в каждом городе. разделяем всю муку на 2 части ПРОПОРЦИОНАЛЬНО полученной норме для каждого города.
#19 by DES
В социальном государстве лучше прибавлять к минимальной сумме.
#20 by Fragster
а теперь в запросе и так, чтобы копейки не терялись :)))
#21 by Fragster
лично у меня - УГ получилось :)
#22 by rs_trade
declare table (id int, b decimal) declare @sum as decimal insert values (1, 100), (2, 50) set @sum = 200 select    cast(@sum / (SUM(b) OVER) * b as decimal(15,2)) AS t from
#23 by Ткачев
Усложним задачу: Есть главный документ. Сумма документа = 150 Нал = 50 БезНал = 100 Он делится на 2 документа. Первый Документ Сумма = 80 Нал = ? БезНал = ? Второй Документ Сумма = 70 Нал = ? БезНал = ? Вот как тут рассчитать оплату из главного документа ?
#24 by Fragster
распредели сумму в 100 пропорционально между 3 одинаковимы значениями, чтобы копейки не потерялись
#25 by Fragster
*одинаковыми
#26 by Fragster
типа 100 + 100 + 100 + 100 => 133,34 + 133,33 + 133,33
#27 by VladZ
В исходной задаче две суммы... В случае, если у одной суммы будет 0,3333333333333 - значит у другой 0,6666666666666. В общем, при округлении все будет хорошо. Вот если было три суммы (и более)... Возникла бы ситуёвина, когда одному 0,3333333333333,   другому  0,3333333333333 и третьему столько же. В результате копеечки могут и не бить.
#28 by Fragster
решение таки должно быть универсальным
#29 by zak555
размазывать нужно как в но с одной оговоркой отсортировать суммы по убыванию и последней сумме добавить остаток
#30 by Ткачев
Суть этого гемора такова: Определенный товар продается на ИП, остальной на ООО (одна касса работает с двумя фискальниками), до того пока не подключили банк все было нормально, вчера подключили...
#31 by Ткачев
т.е. Один Чек ККМ делится на два в зависимости от товара.
#32 by Warlock
( Отклонение = 0; Для Каждого Строка Из ТЗ Цикл    Результат = НужныйРезультат * Строка.Основание / База + Отклонение;    Отклонение = (Результат - Окр(Результат, 2));    Строка.Результат = Окр(Результат, 2); КонецЦикла;
#33 by Ткачев
Это 1с розница, программно деление чека выглядит так:    Если Константы.ДваФР.Получить Тогда        Запрос = Новый Запрос("        |ВЫБРАТЬ * ПОМЕСТИТЬ ТабТов ИЗ &ТабТов КАК ТТ;        |ВЫБРАТЬ *        |ИЗ        |    ТабТов КАК Товары        |ГДЕ        |    Товары.Номенклатура.ТоварОрганизации = &Организация");        Запрос.УстановитьПараметр("ТабТов", Товары.Выгрузить);        ВремКассаККМ = КассаККМ;        Оплаты = Оплата.Выгрузить;        Организации = Справочники.Организации.Выбрать;        Пока Организации.Следующий Цикл            Если Организации.Ссылка = Магазин.ОсновнойСклад.Организация Тогда;                Организация = Справочники.Организации.ПустаяСсылка;            Иначе                Организация = Организации.Ссылка;            КонецЕсли;            Запрос.УстановитьПараметр("Организация", Организация);            Результат = Запрос.Выполнить;            Если Не Результат.Пустой Тогда                ЭтотОбъект.Товары.Загрузить(Результат.Выгрузить);                ФР = ПолучитьСерверТО.ПолучитьИдентификаторПоИдКассы(Организация);                Если ЗначениеЗаполнено(Организация) И Не ПустаяСтрока(ФР) Тогда                    КассаККМ = ПолучитьСерверТО.ПолучитьКассуККМ(ФР);                Иначе                    КассаККМ = ВремКассаККМ;                КонецЕсли;                ИтогСуммы = Товары.Итог("Сумма");                ИтогОплат = Оплаты.Итог("Сумма");                Если ИтогСуммы <> ИтогОплат Тогда                    ЭтотОбъект.Оплата.Загрузить(Оплаты);                    Для Каждого ФормаОплат Из Оплата Цикл                                                //???????????????????????????????                                            КонецЦикла;                КонецЕсли;                ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати, ФР);            КонецЕсли;        КонецЦикла;    Иначе        ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати);        КонецЕсли;
#34 by Fragster
запросом же
#35 by Warlock
Если использовать временные таблицы, то можно распределить результат, а остаток оставить на максимальной/минимальной строке
#36 by Ткачев
Получилось как то так: ...                        Для Каждого ФормаОплат Из Оплата Цикл                            Если ПервыйПроход Тогда                                СуммаОплаты = ИтогСуммы * Окр(ФормаОплат.Сумма / ИтогОплат, 2);                                СписокОплат.Добавить(ФормаОплат.Сумма - СуммаОплаты);                                ФормаОплат.Сумма = СуммаОплаты;                            Иначе                                ФормаОплат.Сумма = СписокОплат.Получить(ФормаОплат.НомерСтроки - 1).Значение;                            КонецЕсли;                        КонецЦикла;                        ПервыйПроход = 0; ...
#37 by rs_trade
В УТ или УПП глянь документ доп. расходы. Там есть алгоритм распределения суммы по кол-ву или объему
#38 by Ненавижу 1С
тупые 1с ники
#39 by Ткачев
Нормально работает, на разных суммах проверял. Так скажите как тупому 1с-нику сделать все правильно в и
#40 by Господин ПЖ
возьмите хоть из УПП типовой что ли... там и то адекватнее написано
#41 by МегаБум
а куда цветовыделение кода 1С делось?
#42 by Эмбеддер
Ошибки округления будут при таком расчете
#43 by Reaper_1c
Трандец, модуль "ОбщегоНазначения" отобрали у автора?
#44 by Ткачев
Если бы у них все было адекватно и работало, не было бы этого форума. Нормально все работает, копейки нигде "не провисают", в отличии от типовых процедур +- 0.01 руб.
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям