Johniya Blog
首页 博客 社区 问答 开发者 约米云盘 注册
按比例分配场景解决
默凌 2024-06-07 13:21:08 北京 开发

很多时候,在开发中都会遇到按比例分配的场景,一般想到的方式是,将权重加和,然后总数除以权重和,算出每一份,然后按照比例在乘回去,但是这样做会有一个问题,就是很大概率最终将分配后的数加和后不等于预分配的总数。

因为在乘法和除法过程,都有精度的丢失,导致总会有一点点分配不完。

在一些要求不严谨的场景下这种做法,没什么问题,但是在一些要求精准的场景下,就不行了,比如:算金额的时候。

那么方法的主要逻辑思想就是,先按照上面的方式进行分配,然后将无法再分配的一部分,分给其中一个。

例:
权重 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
}
云服务器 免费试用 一键搭建个人网站 现在购买,领取免费顶级域名 糯米云
5
1
0
21
评论 0
@Johniya.top