publicstaticdecimalGetPercentValue(decimal[] arr, int idx, int precision) { if (arr.Length - 1 < idx) return0; // 求和 var sum = arr.Sum(); // 10的2次幂是100,用于计算精度。 var digits = (decimal)Math.Pow(10, precision); // 扩大比例100 var votesPerQuota = newdecimal[arr.Length]; for (var i = 0; i < arr.Length; i++) { var val = arr[i] / sum * digits * 100; votesPerQuota[i] = val; } // 总数,扩大比例意味着总数也要扩大 var targetSeats = digits * 100; // 再向下取整,组成数组 var seats = newdecimal[arr.Length]; for (var i = 0; i < votesPerQuota.Length; i++) { seats[i] = Math.Floor(votesPerQuota[i]); }
// 再新计算合计,用于判断与总数量是否相同,相同则占比会100% var currentSum = seats.Sum(); // 余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组 var remainder = newdecimal[arr.Length]; for (var i = 0; i < seats.Length; i++) { remainder[i] = votesPerQuota[i] - seats[i]; } while (currentSum < targetSeats) { decimal max = 0; var maxId = 0; for (var i = 0; i < remainder.Length; ++i) { if (remainder[i] <= max) continue; max = remainder[i]; maxId = i; } // 对最大项余额加1 ++seats[maxId]; // 已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。 remainder[maxId] = 0; // 总的也要加1,为了判断是否总数是否相同,跳出循环。 ++currentSum; } return seats[idx] / digits; }
Atan方法
用于返回正切值的指定数字的角度
1 2
double d = 0.75; double m = Math.Atan(d);
Pow方法
用于返回指定数字的指定次幂
1
double d = Match.Pow(2,3);//表示2的3次幂
Round方法
用于将值舍入到最接近的整数或指定的小数位数
1 2 3 4 5 6 7
//将小数值舍入最接近的整数 double d = Math.Round(2.44);//decimal/double //将小数值舍入到指定精度 d = Math.Round(2.44,2);//decimal/double,int //将小数值舍入最接近的整数 d = Math.Round(2.44,MidpointRounding.ToEven);//ToEven 舍入最接近的偶数;AwayFromZero 舍入绝对值较小的值 d = Math.Round(2.44,2,MidpointRounding.ToEven);