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

  • 相关阅读:
    iOS 即时通讯 + 仿微信聊天框架 + 源码
    Accelerate Framework in Swift
    最新 iOS 框架整体梳理(三)
    最新 iOS 框架整体梳理(二)
    单元测试
    iOS
    画个Shape留意到的东西
    deleteSections & deleteRows 我踩的坑
    常用开发技巧系列(六)
    程序员该如何提高睡眠质量?—程序媛233酱的助攻~
  • 原文地址:https://www.cnblogs.com/haoyul/p/11929874.html
Copyright © 2020-2023  润新知