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