Пропорциональное распределение суммы

Есть довольно распространённая потребность в функции, которая могла бы распределять заданную сумму согласно весовым коэффициентам. На первый взгляд, не очень понятно, о чём речь. Приведу примеры.
Распределение скидки на заказ Допустим, интернет-магазин предоставляет клиенту скидку на заказ (по бонусной карте, купону или ещё как-то). Скидка даётся на весь заказ, но её действие нужно пропорционально распределить по товарам, чтобы, например, правильно сформировать кассовый чек (в нём каждую позицию чека нужно расписать: цена до применения скидки и сумма с учётом скидки). Пример:
1) Товар №1 - цена 1500 руб.
2) Товар №2 - цена 1700 руб.
Итого сумма заказа получается 3200 руб. Допустим, клиенту предоставляется скидка 10%. В данном случае легко посчитать, что скидка в процентах будет одинаковой для каждого товара:
1) Товар №1 - цена со скидкой 1500 - 10% = 1350 руб.
2) Товар №2 - цена со скидкой 1700 - 10% = 1530 руб.
Это лёгкий пример, где никакого распределения не потребовалось. Теперь и…
Распределение скидки на заказ Допустим, интернет-магазин предоставляет клиенту скидку на заказ (по бонусной карте, купону или ещё как-то). Скидка даётся на весь заказ, но её действие нужно пропорционально распределить по товарам, чтобы, например, правильно сформировать кассовый чек (в нём каждую позицию чека нужно расписать: цена до применения скидки и сумма с учётом скидки). Пример:
1) Товар №1 - цена 1500 руб.
2) Товар №2 - цена 1700 руб.
Итого сумма заказа получается 3200 руб. Допустим, клиенту предоставляется скидка 10%. В данном случае легко посчитать, что скидка в процентах будет одинаковой для каждого товара:
1) Товар №1 - цена со скидкой 1500 - 10% = 1350 руб.
2) Товар №2 - цена со скидкой 1700 - 10% = 1530 руб.
Это лёгкий пример, где никакого распределения не потребовалось. Теперь и…