问题:在开发中有这样的问题,就是需要在其他地方展示百分比,但是自己计算的百分比通过四舍五入后,与饼图里面的百分比不一致的问题,要想解决这个问题,那么必须要使用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