很多时候,在开发中都会遇到按比例分配的场景,一般想到的方式是,将权重加和,然后总数除以权重和,算出每一份,然后按照比例在乘回去,但是这样做会有一个问题,就是很大概率最终将分配后的数加和后不等于预分配的总数。
因为在乘法和除法过程,都有精度的丢失,导致总会有一点点分配不完。
在一些要求不严谨的场景下这种做法,没什么问题,但是在一些要求精准的场景下,就不行了,比如:算金额的时候。
那么方法的主要逻辑思想就是,先按照上面的方式进行分配,然后将无法再分配的一部分,分给其中一个。
例:
权重 A:0.2 B:0.43 C:0.11
总量 N:12345
X = A + B + C
P = N / X
AN = A * P
BN = B * P
CN = N - AN - BN
这么的话,就可以保证 AN + BN + CN = N
伪代码如下:
test(array[], amount) {
total = 0
for(a in array) {
total += a
}
percent = amount / total
res = []
sum = 0
for(i = 0; i < array.length; i ++) {
if(i == array.length - 1) {
res[i] = amount - sum
} else {
res[i] = array[i] * percent
sum += res[i]
}
}
return res
}