最近工作中使用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);//扩大比例100double[] 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)相关推荐

  1. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  2. Echarts饼图百分比算法利用Java实现

    问题:在开发中有这样的问题,就是需要在其他地方展示百分比,但是自己计算的百分比通过四舍五入后,与饼图里面的百分比不一致的问题,要想解决这个问题,那么必须要使用echarts源码中的计算方式.当存在四舍 ...

  3. java取余数的函数_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  4. 饼状图百分比算法--最大余额法

    前段时间测试提了一个bug,我打开一开,好家伙!原来是echarts饼状图数据展示百分比有一个与legend百分比的展示不一样.拿起手机一算果然,饼状图加在一起刚好100%,而legend加在一起是9 ...

  5. 除留余数法构造哈希表_哈希表算法原理

    基本概念 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 哈 ...

  6. 加减法、原码一位乘法、Booth算法、恢复余数法、加减交替法符号位及小结

    在学习计算机组成原理的计算方法时,或为步骤疑惑,或为题目难倒,本文主要介绍思路以及对常用类型小结 个人总结,仅供参考,能力有限,难免出错,欢迎大家讨论,书籍参考唐朔飞版<计算机组成原理> ...

  7. java二分查找法视频_078-二分查找算法思路图解

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  8. java 符号三角形_算法java实现--回溯法--符号三角形问题

    符号三角形问题的java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8764319 /* ...

  9. Java构建HashCode相同字符串算法

    import java.math.BigDecimal; import java.util.Random;/*** "中间相遇法"是生日攻击的一种变形,它不比较Hash值,而是比较 ...

最新文章

  1. Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题
  2. 将应用程序集成为Heroku附加组件
  3. 如何在 Ubuntu 14.04 和 12.04 上测试 systemd
  4. 实现多线程Callable接口
  5. Python附带了大量的库 - 初学者如何学起
  6. java中利用框架传入相同的url实现crud操作_Java SSM框架基础面试题
  7. sql 批量插入数据到Sqlserver中 效率较高的方法
  8. md5算法不可逆,为啥网上很多网站声称可以解密md5
  9. gflags的交叉编译
  10. itextpdf识别不了一些中文字体的问题
  11. mysql全文检索 中文_mysql全文索引不支持中文的解决方案
  12. Unity 3D 如何获取鼠标移动事件
  13. 尖角科技:个人隐私安全检测系统上线了! !
  14. 用计算机弹奏的成都,抖音成都怎么用计算器弹奏_抖音成都计算器乐谱_管理资源吧...
  15. linux修改只读文件指令,linux修改文件权限
  16. ChatGPT提问指令大全
  17. 【转】Foobar 2000设置replay gain
  18. 大容量U盘制作USB多重系统启动盘初探
  19. office之PPT插入页码没有反应
  20. vmware安装linux后没有声音,安装虚拟机后没声音了

热门文章

  1. 向大家介绍一位牛逼的IT老师 => 廖神
  2. ubuntu1804搭建kamailio SIP服务器
  3. 公有云的未来:要么统治世界,要么灭亡
  4. JVM-常见SOFE和OOM错误(十)
  5. Stanford UE4 UE5 C++ 开发 课程笔记(二) 实现粒子发射效果
  6. MAC IOS10.12 下的 CAD 2014 安装过程
  7. 查找算法之三:斐波那契查找(黄金分割法)
  8. rest客户端java生成_rest – 使用Enunciate生成Java客户端库
  9. 广发银行李怀根:架构设计要有前瞻性,敢于对标敢于重构
  10. Linux命令能否运行在Windows上?