面向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

目录
相关文章
|
5天前
|
Java
Java如何标记异步方法
【8月更文挑战第13天】Java如何标记异步方法
14 1
|
12天前
|
安全 机器人 Java
|
5天前
|
Java
【Java】Math、System、RunTime、BigDecimal类常用方法
【Java】Math、System、RunTime、BigDecimal类常用方法
|
1天前
|
搜索推荐 Java 程序员
在Java编程的旅程中,条件语句是每位开发者不可或缺的伙伴,它如同导航系统,引导着程序根据不同的情况做出响应。
在Java编程中,条件语句是引导程序根据不同情境作出响应的核心工具。本文通过四个案例深入浅出地介绍了如何巧妙运用if-else与switch语句。从基础的用户登录验证到利用switch处理枚举类型,再到条件语句的嵌套与组合,最后探讨了代码的优化与重构。每个案例都旨在帮助开发者提升编码效率与代码质量,无论是初学者还是资深程序员,都能从中获得灵感,让自己的Java代码更加优雅和专业。
5 1
|
1天前
|
存储 Java
|
11天前
|
存储 Java 编译器
Java 基础语法-方法
Java 基础语法-方法
26 12
|
6天前
|
Java
Java aop 如何获取方法的参数体
【8月更文挑战第12天】Java aop 如何获取方法的参数体
29 2
|
11天前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
38 8
|
11天前
|
Java API 开发者
Java中的Lambda表达式:简化代码的现代方法
Lambda表达式,这一Java 8引入的特性,为开发者提供了一种更加紧凑、易读的编码风格。本文将深入探讨Lambda表达式的概念、使用场景以及它如何改变我们处理集合、线程和函数式接口的方式,旨在帮助读者理解并有效利用Lambda表达式来优化他们的Java代码。
|
9天前
|
机器学习/深度学习 算法 Java
Java调用Python方法
【8月更文挑战第7天】