最近工作中使用Echarts開發報表的時候遇到了這樣的一個問題,需求是一個div中左邊是一個環形圖表,右邊是一個表格,表格中展示圖表中每個類別占用的百分比。
存在的問題:
1.當存在四舍五入的時候,Echarts的百分比算法和自己寫的百分比算法不同,導致相加后不等於100%.
2.當Echarts圖中比如有3個類型值都是13.888,其中有一個類型需要加百分之0.1可以滿足100%,無法確定自己程序是否和Echarts百分比相同.
如下圖:
解決辦法:
遇到問題后,先是百度Echarts百分比算法,只有js版本,沒辦法,只能想辦法改造成java版本,通過一步步調試js代碼和java代碼進行驗證最終改造成功。
代碼如下:
1 package all; 2 3 public class DemoTest { 4 /** 5 * 數組 6 * @param arr 數組 7 * @param sum 總數 8 * @param idx 索引 9 * @param precision 精度 10 * @return 11 */ 12 public static double getPercentValue(int[] arr,double sum,int idx,int precision){ 13 if((arr.length-1) < idx){ 14 return 0; 15 } 16 //求和 17 if(sum <= 0){ 18 for (int i = 0; i < arr.length; i++) { 19 sum += arr[i]; 20 } 21 } 22 //10的2次冪是100,用於計算精度。 23 double digits = Math.pow(10,precision); 24 //擴大比例100 25 double[] votesPerQuota = new double[arr.length]; 26 for(int i = 0; i < arr.length; i++){ 27 double val = arr[i] / sum * digits * 100; 28 votesPerQuota[i] = val; 29 } 30 //總數,擴大比例意味的總數要擴大 31 double targetSeats = digits * 100; 32 //再向下取值,組成數組 33 double[] seats = new double[arr.length]; 34 for(int i = 0; i < votesPerQuota.length; i++){ 35 seats[i] = Math.floor(votesPerQuota[i]); 36 } 37 //再新計算合計,用於判斷與總數量是否相同,相同則占比會100% 38 double currentSum = 0; 39 for (int i = 0; i < seats.length; i++) { 40 currentSum += seats[i]; 41 } 42 //余數部分的數組:原先數組減去向下取值的數組,得到余數部分的數組 43 double[] remainder = new double[arr.length]; 44 for(int i = 0; i < seats.length; i++){ 45 remainder[i] = votesPerQuota[i] - seats[i]; 46 } 47 while(currentSum < targetSeats){ 48 double max = 0; 49 int maxId = 0; 50 int len = 0; 51 for(int i = 0;i < remainder.length;++i){ 52 if(remainder[i] > max){ 53 max = remainder[i]; 54 maxId = i; 55 } 56 } 57 //對最大項余額加1 58 ++seats[maxId]; 59 //已經增加最大余數加1,則下次判斷就可以不需要再判斷這個余額數。 60 remainder[maxId] = 0; 61 //總的也要加1,為了判斷是否總數是否相同,跳出循環。 62 ++currentSum; 63 } 64 // 這時候的seats就會總數占比會100% 65 return seats[idx] / digits; 66 } 67 68 public static void main(String[] args) { 69 int[] arr = new int[]{1,3,5,7,9,5}; 70 for(int i = 0;i < arr.length; i++){ 71 System.out.println("值:"+getPercentValue(arr,30,i,2)); 72 } 73 } 74 }
執行結果:
證明:
通過計算他們的和等於100%,這個主要結果的是相加等於100%的問題,一般當四舍五入的時候相加就不等於總數100%了。