一、问题

由于需要兼容低版本ie,使用的echarts版本较低,为2.2.x。当前版本有饼图百分比不为100%的问题,如数据为如下:
[
{ name: ‘测试1’, value: 1 },
{ name: ‘测试2’, value: 1 },
{ name: ‘测试3’, value: 1 }
]
当前版本饼图计算的百分比均为33.33%,最新版本计算的百分比是33.34%、33.33%、33.33%。

二、解决方法

搜索了一些文章是说用了最大余数法,但是在外部使用插件时无法使用这个算法,又不能改数据。只能修改源码。

1.增加转为百分数方法

(是从最新版本的number.ts拷贝过来修改ts格式为js,并处理为UglifyJs支持的方法)
文件路径echarts/util/number.js
顶部引入zrUtil:

var zrUtil = require('zrenderjs/tool/util');

增加的方法:

    /*** 获取给定精度的数据,确保valueList中的百分比之和为1* 采用最大余数法* @param {number[]} valueList 所有数据的列表* @param {number} idx 数据的索引* @param {number} precision 精度* @return {number} 百分数*/function getPercentWithPrecision(valueList, idx, precision) {if (!valueList[idx]) {return 0;}var sum = valueList.reduce(function (acc, val) {return acc + (isNaN(val) ? 0 : val);}, 0);if (sum === 0) {return 0;}var digits = Math.pow(10, precision);var votesPerQuota = zrUtil.map(valueList, function (val) {return (isNaN(val) ? 0 : val) / sum * digits * 100;});var targetSeats = digits * 100;var seats = zrUtil.map(votesPerQuota, function (votes) {// Assign automatic seats.return Math.floor(votes);});var currentSum = seats.reduce(function (acc, val) {return acc + val;}, 0);var remainder = zrUtil.map(votesPerQuota, function (votes, idx) {return votes - seats[idx];});// Has remainding votes.while (currentSum < targetSeats) {// Find next largest remainder.var max = -Infinity;//Number.NEGATIVE_INFINITY;var maxId = null;for (var i = 0, len = remainder.length; i < len; ++i) {if (remainder[i] > max) {max = remainder[i];maxId = i;}}// Add a vote to max remainder.++seats[maxId];remainder[maxId] = 0;++currentSum;}return seats[idx] / digits;}

最后增加抛出的方法

return {//...getPercentWithPrecision: getPercentWithPrecision
}

2.修改百分数计算值

文件路径:echarts/chart/pie.js
顶部引入转百分比方法

var getPercentWithPrecision = require('echarts/util/number').getPercentWithPrecision;

绘图时计算百分比修改

/*** 构建单个饼图** @param {number} seriesIndex 系列索引*/
_buildSinglePie: function (seriesIndex) {//...var percentPrecision = (serie.percentPrecision || serie.percentPrecision === 0) ? serie.percentPrecision : 2;//百分数精度(增加percentPrecision配置)//...for (var i = 0, l = data.length; i < l; i++) {//...var valueList = zrUtil.map(data, function(obj) {return obj.value});percent = getPercentWithPrecision(valueList, i, percentPrecision) / 100;//修改百分比赋值,调用新方法//...percent = (percent * 100).toFixed(percentPrecision);//百分数精度从配置取}
}

三、算法原理

根据小数精度,将每一项占总和的百分数扩大至整数,比如[100,100,100],第一项计算为3333.33333333,然后整数部分就是3333,将余数求出来就是0.33333333,然后3项做同样的操作,得到余数数组。
判断百分数整数之和是否为100*小数精度,如果小于100*小数精度说明最后的百分比之和会小于100%,否则没有问题直接返回即可。
若百分比之和小于100%:通过遍历余数数组找到最大的余数,说明这一项占比比其他2项更大,因此给这一项的百分数整数+1,就得到3334,最后的结果整数为[3334,3333,3333],然后将百分数整数转为百分数即[33.34,33.33,33.33]。

四、遇到的报错

from UglifyJs
Unexpected token: name (currentSum)

原因:map要用zrUtil中的map方法,因为map是es6的内容,UglifyJs不支持。
reduce可以直接用,es3就支持了。

from UglifyJs
Unexpected token: operator (>)

原因:使用了箭头函数,修改箭头函数为function匿名函数。

echarts饼图百分比不为100%相关推荐

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

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

  2. echarts饼图百分比的直接展示

    引用echart的版本不一样,写法也存在差异 <div id="wraper" style="width: 1100px;height: 500px;backgro ...

  3. echarts 饼图效果,显示其对应数值及百分比

    需求:echarts 饼图效果,显示其对应数值及百分比 代码 <Chart1 :ecStyle="ecStyle" :ecOption="optionRight2& ...

  4. 解决echarts饼图显示百分比,和显示内容字体及大小,如何给eCharts饼图区域指定颜色

    解决echarts饼图显示百分比,和显示内容字体及大小 // 基于准备好的dom,初始化echarts实例         var pieEchart = echarts.init(document. ...

  5. Echarts饼图显示数值和百分比

    Echarts 饼图显示名称,数值和百分比 核心: series : [ {name:'',type : 'pie',radius : '65%',center : [ '50%', '50%' ], ...

  6. echarts饼图显示占比(内部和外部显示百分比设置)

    1.效果图: 2.代码: series: [{name: '产量',type: 'pie',center: ['22%', '50%'],radius: ['0', '82%'],avoidLabel ...

  7. Echarts饼图之数据展示

    Echarts饼图之数据展示 1.组件简介 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,C ...

  8. echarts饼图属性

    1.标题移动到右边 原本 legend: {data:['同龄普通孩子','已具备技能','已泛化技能','已掌握技能','学习中'] }, 改 legend: {data:['同龄普通孩子','已具 ...

  9. echarts饼图 配置,及案例

    echarts饼图 配置,及案例 案例(1): let option = {tooltip: { //提示框trigger: 'axis',formatter: '{a} <br/>{b} ...

最新文章

  1. rtems线程管理与调度(一)
  2. pycharm acejumpchar插件
  3. c语言如何判断数据是否符合正态分布_统计学里的数据正态性检验
  4. 如何用css设计出商品购物图片
  5. 从WINDOWS日志判断哪块硬盘好坏!!
  6. curl命令详解_命令行学习(一)基础命令
  7. yii的pathinfo方式实现
  8. Atitit java播放mp3 目录 1.1. 不能直接支持mp3播放。。需要解码播放转化为pcm 1 1.2. 使用\javalayer类库播放 3 1.3. ,就是普通的java sound
  9. 安装32位linux系统安装教程,Ubuntu16.04安装32位支持库
  10. 玩转群晖NAS套件系列一:cloud sync套件的安装与使用保姆级教程!
  11. 《Windows黑客编程技术》—— 学习历程
  12. Oracle导入Excel中数据
  13. 串口公头母头: RS232 DB9 公头 母头 串口引脚定义
  14. Mysql 8.0.27 免安装配置教程(windows)
  15. Linux CRDA(Central Regulatory Domain Agent)简介
  16. 弄明白HASH,你就弄明白区块链的一大半
  17. OpenCV每日函数 图像处理模块 applyColorMap颜色映射函数
  18. 【Android】短信验证码输入框(80/100)
  19. 制作一个评选优秀老师和学生的系统,系统根据提示输入类别(老师或学生), 如果是老师则输入姓名和论文数,学生则输入姓名和考试成绩,输入若干人员信息后使用结束符完成输入,程序根据输入的数据列出优秀老师和优
  20. idea intellij 教育版申请

热门文章

  1. 【油猴Tampermonkey】脚本安装教程+自用脚本推荐
  2. 微雪电子7寸hdmi-lcd(C)在树莓派的使用
  3. Partial-ReID
  4. 特斯拉冻结招聘或因「幽灵刹车」故障,全球大厂掀裁员潮人心惶惶
  5. 苹果cms模板_首涂第三套苹果CMSv10自适应视频站模板
  6. 程序员应对面试的好东西
  7. 错误:Unfortunately you can‘t have non-Gradle Java modules and Android-Gradle modules in one project.
  8. 微信小程序之微票前后端简易版+五天实训总结
  9. android获取当前连接的蓝牙名称,获取当前连接的蓝牙设备的名称
  10. icomoon字体图标的使用