zoukankan      html  css  js  c++  java
  • 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%了。

  • 相关阅读:
    Analysis Services features supported by SQL Server editions
    Azure DevOps to Azure AppServices
    Power BI For Competition
    Win10开机“提示语音”以及”随机播放音乐”
    Azure DevOps
    Allow Only Ajax Requests For An Action In ASP.NET Core
    Mobile CI/CD 101
    Configure SSL for SharePoint 2013
    AWS Step Function Serverless Applications
    Cordova Upload Images using File Transfer Plugin and .Net core WebAPI
  • 原文地址:https://www.cnblogs.com/haoyul/p/11929874.html
Copyright © 2011-2022 走看看