我有一个问题,我需要在一定数量的收件人之间分配多个(几千个)数量,这样每个数量必须分成整数并使用相同的比例。 我需要找到一个能够可靠而有效地实现这一目标的算法(不是我们所有人?:-))
这是为了解决金融市场(证券交易所订单)中的一个问题,即订单可能会获得数千个“填充”,并且在一天结束时必须分配给少数客户,同时保持订单的平均价格。这是一个例子:
总订单数量37300
联交所填写的数量
执行1. 16700股,价格为75.84
执行2. 5400股,价格为75.85
执行3. 4900股,价格为75.86
执行4. 10300股,价格为75.87
共计37300股平均价格=(16700 * 75.84 + 5400 * 75.85 + 4900 * 75.86 + 10300 * 75.87)/ 37300 = 75.85235925
假设我需要在3个客户端之间拆分这些数量,以便:
客户1:15000股
Client2:10000股
客户3:12300股
每个执行都必须单独拆分(我不能只按每个客户要求的数量定价平均价格)
我的第一个想法是按比例分配:
客户1获得15000/37300 = 0.402144772
客户2获得10000/37300 = 0.268096515
客户3获得12300/37300 = 0.329758713
哪会导致
Client1 - 15000 Client2 - 10000 Client3 - 12300 比率:0.402144772比率:0.268096515比率:0.329758713
Splits(抱歉格式化 - 这是我在Post编辑器中可以做的最好的事情)
+-------------+-------------+-------------+
| Client 1 | Client 2 | Client 3 |
+-------------+-------------+-------------+
| 6715.817694 | 4477.211796 | 5506.970509 |
| 2171.581769 | 1447.72118 | 1780.697051 |
| 1970.509383 | 1313.672922 | 1615.817694 |
| 4142.091153 | 2761.394102 | 3396.514745 |
+-------------+-------------+-------------+
| Totals: | | |
| 15000 | 10000 | 12300 |
+-------------+-------------+-------------+
这个问题是我不能将小数量分配给客户,所以我需要一个智能算法来调整数量,使得这些分裂的小数部分为0.我明白在许多场景中这可能是不可能的这个要求可以放松一点,以便某个客户获得更多(或更少)。
有人知道我可以用作此问题的起点的算法吗?
答案 0 :(得分:1)
你可以舍入所有数字(比率[n] * totalQuantity)除了最后一个(可能是最小的)最后一个必须是totalQuantity - 其他的总和。这将为您提供整数,同时具有接近您选择的比率的正确总数。
答案 1 :(得分:0)
尝试从不同的角度来看待这个问题。您已经知道每个客户端获得了多少份额。您想要计算每个人必须支付的公平总金额,并且这样做而不会舍入错误。
因此,您希望此总计美元金额没有舍入问题,即精确到0.01。
然后可以使用美元金额计算价格并显示为所需的精确度。
相反(计算价格,然后得出金额)将始终产生与美元金额的四舍五入问题。
假设价格是每100个单位,这是实现此目的的一种方法:
计算订单总金额(16,700 * 75.84 / 100 + 5,400 * 75.85 / 100 + 4,900 * 75.86 / 100 + 10,300 * 75.87 / 100)= $ 28,292.93
根据订购的比例数量/填充数量,分配除1以外的所有客户:
客户2 = $ 28,292.93 / 37,300 * 10,000 = $ 7,585,24 价格= 7,585,24 / 10,000 * 100 = 75.8524。
客户3 = $ 28,292.93 / 37,300 * 12,300 = $ 9,329.84 价格= $ 9,329.84 / 12,300 * 100 = 75.85235772
$ 28,292.93 - ($ 7,585,24 + $ 9,329.84)= $ 11,377.85。 价格= $ 11,377.85 / 15,000 * 100 = 75.85233333
在这里,我随意挑选了客户端1,数量最多的客户端1作为余数计算的对象。