java最大余數法(百分比算法Echarts)


最近工作中使用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%了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM