面向Java开发者的Echarts饼图百分比计算方法

简介: 面向Java开发者的Echarts饼图百分比计算方法

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

如下图:数据不一致的问题

百分比算法源码地址:https://github.com/apache/echarts/blob/HEAD/src/util/number.ts

Java方式解决:

1. public class DemoTest {
2. /**
3.      * 数组
4.      *
5.      * @param arr       数组
6.      * @param sum       总数
7.      * @param idx       索引
8.      * @param precision 精度
9.      */
10. public static double getPercentValue(int[] arr, double sum, int idx, int precision) {
11. if ((arr.length - 1) < idx) {
12. return 0;
13.         }
14. //求和
15. if (sum <= 0) {
16. for (int j : arr) {
17.                 sum += j;
18.             }
19.         }
20. //10的2次幂是100,用于计算精度。
21. double digits = Math.pow(10, precision);
22. //扩大比例100
23. double[] votesPerQuota = new double[arr.length];
24. for (int i = 0; i < arr.length; i++) {
25. double val = arr[i] / sum * digits * 100;
26.             votesPerQuota[i] = val;
27.         }
28. //总数,扩大比例意味的总数要扩大
29. double targetSeats = digits * 100;
30. //再向下取值,组成数组
31. double[] seats = new double[arr.length];
32. for (int i = 0; i < votesPerQuota.length; i++) {
33.             seats[i] = Math.floor(votesPerQuota[i]);
34.         }
35. //再新计算合计,用于判断与总数量是否相同,相同则占比会100%
36. double currentSum = 0;
37. for (double seat : seats) {
38.             currentSum += seat;
39.         }
40. //余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组
41. double[] remainder = new double[arr.length];
42. for (int i = 0; i < seats.length; i++) {
43.             remainder[i] = votesPerQuota[i] - seats[i];
44.         }
45. while (currentSum < targetSeats) {
46. double max = 0;
47. int maxId = 0;
48. int len = 0;
49. for (int i = 0; i < remainder.length; ++i) {
50. if (remainder[i] > max) {
51.                     max = remainder[i];
52.                     maxId = i;
53.                 }
54.             }
55. //对最大项余额加1
56.             ++seats[maxId];
57. //已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。
58.             remainder[maxId] = 0;
59. //总的也要加1,为了判断是否总数是否相同,跳出循环。
60.             ++currentSum;
61.         }
62. // 这时候的seats就会总数占比会100%
63. return seats[idx] / digits;
64.     }
65. 
66. public static void main(String[] args) {
67. int[] arr = new int[]{12, 1, 1, 1, 1, 1, 1};
68. for (int i = 0; i < arr.length; i++) {
69.             System.out.println("值:" + getPercentValue(arr, 18, i, 2));
70.         }
71.     }
72. }

结果如下:

开发中从后端计算好即可解决问题。如下

文章参考:https://blog.csdn.net/qq_16438883/article/details/102953597

目录
相关文章
|
23天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
42 1
Spring 框架:Java 开发者的春天
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
21天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
42 17
|
11天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
32 2
|
14天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
27 2
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
23天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
22天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
16 3
|
24天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
22天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
15 2