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%了。

原文地址:https://www.cnblogs.com/haoyul/p/11929874.html