java最大余数法(百分比算法Echarts)
最近工作中使用Echarts开发报表的时候遇到了这样的一个问题,需求是一个div中左边是一个环形图表,右边是一个表格,表格中展示图表中每个类别占用的百分比。
存在的问题:
1.当存在四舍五入的时候,Echarts的百分比算法和自己写的百分比算法不同,导致相加后不等于100%.
2.当Echarts图中比如有3个类型值都是13.888,其中有一个类型需要加百分之0.1可以满足100%,无法确定自己程序是否和Echarts百分比相同.
如下图:

解决办法:
遇到问题后,先是百度Echarts百分比算法,只有js版本,没办法,只能想办法改造成java版本,通过一步步调试js代码和java代码进行验证最终改造成功。
代码如下:
package all;
public class DemoTest {
/**
* 数组
* @param arr 数组
* @param sum 总数
* @param idx 索引
* @param precision 精度
* @return
*/
public static double getPercentValue(int[] arr,double sum,int idx,int precision){
if((arr.length-1) < idx){
return 0;
}
//求和
if(sum <= 0){
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
}
//10的2次幂是100,用于计算精度。
double digits = Math.pow(10,precision);
//扩大比例100
double[] votesPerQuota = new double[arr.length];
for(int i = 0; i < arr.length; i++){
double val = arr[i] / sum * digits * 100;
votesPerQuota[i] = val;
}
//总数,扩大比例意味的总数要扩大
double targetSeats = digits * 100;
//再向下取值,组成数组
double[] seats = new double[arr.length];
for(int i = 0; i < votesPerQuota.length; i++){
seats[i] = Math.floor(votesPerQuota[i]);
}
//再新计算合计,用于判断与总数量是否相同,相同则占比会100%
double currentSum = 0;
for (int i = 0; i < seats.length; i++) {
currentSum += seats[i];
}
//余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组
double[] remainder = new double[arr.length];
for(int i = 0; i < seats.length; i++){
remainder[i] = votesPerQuota[i] - seats[i];
}
while(currentSum < targetSeats){
double max = 0;
int maxId = 0;
int len = 0;
for(int i = 0;i < remainder.length;++i){
if(remainder[i] > max){
max = remainder[i];
maxId = i;
}
}
//对最大项余额加1
++seats[maxId];
//已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。
remainder[maxId] = 0;
//总的也要加1,为了判断是否总数是否相同,跳出循环。
++currentSum;
}
// 这时候的seats就会总数占比会100%
return seats[idx] / digits;
}
public static void main(String[] args) {
int[] arr = new int[]{1,3,5,7,9,5};
for(int i = 0;i < arr.length; i++){
System.out.println("值:"+getPercentValue(arr,30,i,2));
}
}
}
执行结果:

证明:
通过计算他们的和等于100%,这个主要结果的是相加等于100%的问题,一般当四舍五入的时候相加就不等于总数100%了。
java最大余数法(百分比算法Echarts)的更多相关文章
- 如何用70行Java代码实现深度神经网络算法
http://www.tuicool.com/articles/MfYjQfV 如何用70行Java代码实现深度神经网络算法 时间 2016-02-18 10:46:17 ITeye 原文 htt ...
- Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un
ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法 Java 实例 汉诺塔(又称河内塔)问题是源 ...
- Java判断回文数算法简单实现
好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...
- Java中常用的查找算法——顺序查找和二分查找
Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...
- 深入理解java虚拟机【垃圾回收算法】
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- Java学习之二分查找算法
好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...
- Java面试常考------------------------垃圾收集算法
对于Java系学生而言,Java虚拟机中的垃圾收集算法是一个很重要的面试考点. 常用的垃圾收集算法主要可划分为以下三类: 1. 标记-清除算法 标记清除算法是一种比较简单的方法,直接标记内存中待回收的 ...
- Java调用Javascript、Python算法总结
最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用,即在Java程序中调用这些算法. 不管是调 ...
- [转]Java调用Javascript、Python算法总结
最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用,即在Java程序中调用这些算法. 不管是调 ...
随机推荐
- C#& Screen 类&(&多&屏&幕&开&发)
原文:C#& Screen 类&(&多&屏&幕&开&发) Screen 类 下面的代码示例演示如何使用 Screen 类的各种方法和属性. 该示 ...
- 火狐浏览器缓存导致JS已经改变的ID没改变
问题主要就是火狐浏览器缓存. 比如,自己写一个JS,如下: $(document).ready(function () { $("#bigRoom").live("cli ...
- 双十一HostGator独立服务器方案
一年一度的“双十一”购物狂欢节到来,各大电商平台线上消费的各种“吸金”开启了“双十一”模式,一年一度的“双十一”网购狂欢又开始以“巨大的价格优势”来勾起消费者的购买欲望. 此次双十一期间,HostGa ...
- [Usaco2005 Dec]Cleaning Shifts
[Usaco2005 Dec]Cleaning Shifts 给出n段区间,左右端点分别为\(l_i,r_i\),以及选取这段区间的费用\(c_i\),现在要选出若干个区间,使其完全覆盖区间\([m, ...
- [JZOJ3424] 【NOIP2013模拟】粉刷匠
题目 题目大意 有\(K\)种颜色的小球,每种颜色的小球有\(c_i\)个. 求相邻颜色不同的排列的方案数. \(K\leq 15\)且\(c_i\leq 6\) 思考历程&正解1 我是一个智 ...
- Idea jsp页面乱码
jsp页面中添加 <%@ page language="java" contentType="text/html; charset=utf-8" page ...
- Myeclipse从外部导入项目时,jsp和html页面中所有的onclick="return xx()"位置均出现cannot return from outside function() or method()错误
- linux下常见的包安装方式
linux下常见的包安装方式 一.总结 一句话总结: rpm包安装 tar.gz源代码包安装 yum方式安装rpm包 bin文件安装 1.yum是什么? 安装所有依赖的软件包 Yum(全称为 Yell ...
- Http学习(二)
使用首部字段是为了给浏览器和服务器提供报文主体大小.所使用语言.认证信息等 4种首部字段类型 通用首部字段 请求首部字段 响应首部字段 实体首部字段 详细说明: HTTP首部字段类型 通用首部字段: ...
- SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Depart
今天在整合ssh三个框架时,有一个功能,是查询所有员工信息,且员工表和部门表是多对一的映射关系,代码能正常运行到查询得到一个List集合,但在页面展示的时候,就报异常了, java.lang.Clas ...