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

目录
相关文章
|
4月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
490 1
|
5月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
254 4
|
4月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
2039 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
3月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
322 18
|
3月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
242 4
|
4月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
180 11
|
3月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
335 5
|
4月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
5月前
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
348 46
|
4月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
271 3

热门文章

最新文章