關於統計中的百分比之和不等於100的問題(Java)

減幅百分比怎麼計算

問題簡述

在計算統計表格百分比的過程中,由於精度問題計算結果值總是出現99。97%或是100。1%不等於100%的情況,最初的方案一般都是透過最後一個值等於1 減去百分比來完成計算,但這種方式存在弊端。經常出現異常資料,經過在查詢有以下方法。

關於統計中的百分比之和不等於100的問題(Java)

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