關於統計中的百分比之和不等於100的問題(Java)
減幅百分比怎麼計算
問題簡述
在計算統計表格百分比的過程中,由於精度問題計算結果值總是出現99。97%或是100。1%不等於100%的情況,最初的方案一般都是透過最後一個值等於1 減去百分比來完成計算,但這種方式存在弊端。經常出現異常資料,經過在查詢有以下方法。
public void test1(){
int[] arr = new int[]{3,3,3};
for(int i = 0;i < arr。length; i++){
System。out。println(“值:”+getPercentValue(arr,9,i,2));
}
}
/**
* 陣列
* @param arr 陣列
* @param sum 總數
* @param idx 索引
* @param precision 精度
* @return
*/
public static double getPercentValue(int[] arr,double sum,int idx,int precision){
if((arr。length-1) < idx){
return 0;
//求和
if(sum <= 0){
for (int i = 0; i < arr。length; i++) {
sum += arr[i];
}
//10的2次冪是100,用於計算精度。
double digits = Math。pow(10,precision);
//擴大比例100
double[] votesPerQuota = new double[arr。length];
double val = arr[i] / sum * digits * 100;
votesPerQuota[i] = val;
//總數,擴大比例意味的總數要擴大
double targetSeats = digits * 100;
//再向下取值,組成陣列
double[] seats = new double[arr。length];
for(int i = 0; i < votesPerQuota。length; i++){
seats[i] = Math。floor(votesPerQuota[i]);
//再新計算合計,用於判斷與總數量是否相同,相同則佔比會100%
double currentSum = 0;
for (int i = 0; i < seats。length; i++) {
currentSum += seats[i];
//餘數部分的陣列:原先陣列減去向下取值的陣列,得到餘數部分的陣列
double[] remainder = new double[arr。length];
remainder[i] = votesPerQuota[i] - seats[i];
while(currentSum < targetSeats){
double max = 0;
int maxId = 0;
int len = 0;
for(int i = 0;i < remainder。length;++i){
if(remainder[i] > max){
max = remainder[i];
maxId = i;
}
//對最大項餘額加1
++seats[maxId];
//已經增加最大餘數加1,則下次判斷就可以不需要再判斷這個餘額數。
remainder[maxId] = 0;
//總的也要加1,為了判斷是否總數是否相同,跳出迴圈。
++currentSum;
// 這時候的seats就會總數佔比會100%
return seats[idx] / digits;
計算結果
值:33。34
值:33。33