java百分比加起来不是一百_Kotlin版本的最大余额法实现(网上有Java版,解决百分比相加结果不等于100%)...

object PercentKit {

/**

* 修复百分比结果相加不等于100的问题

* @param arr 原始值的数组

* @param sum 原始值之和

* @param idx 当前位置索引

* @param scale 精度

*

* @return 返回结果乘以100后的值,比如 0.333 返回 33.3

*/

fun getPercentValue(arr: List, sum: Double, idx: Int, scale: Int): Double {

var sum = sum

if (arr.size - 1 < idx) {

return 0.0.round(scale)

}

//求和

if (sum <= 0) {

for (i in arr.indices) {

sum += arr[i]

}

}

//10的2次幂是100,用于计算精度。

val digits = 10.0.pow(scale.toDouble())

//扩大比例100

val votesPerQuota = DoubleArray(arr.size)

for (i in arr.indices) {

val `val` = arr[i] / sum * digits * 100

votesPerQuota[i] = `val`

}

//总数,扩大比例意味的总数要扩大

val targetSeats = digits * 100

//再向下取值,组成数组

val seats = DoubleArray(arr.size)

for (i in votesPerQuota.indices) {

seats[i] = floor(votesPerQuota[i])

}

//再新计算合计,用于判断与总数量是否相同,相同则占比会100%

var currentSum = 0.0

for (i in seats.indices) {

currentSum += seats[i]

}

//余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组

val remainder = DoubleArray(arr.size)

for (i in seats.indices) {

remainder[i] = votesPerQuota[i] - seats[i]

}

while (currentSum < targetSeats) {

var max = 0.0

var maxId = 0

for (i in remainder.indices) {

if (remainder[i] > max) {

max = remainder[i]

maxId = i

}

}

//对最大项余额加1

++seats[maxId]

//已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。

remainder[maxId] = 0.0

//总的也要加1,为了判断是否总数是否相同,跳出循环。

++currentSum

}

// 这时候的seats就会总数占比会100%

return seats[idx] / digits

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值