diff --git a/src/chart/map.js b/src/chart/map.js index 6a4628f037..57ba8a811e 100644 --- a/src/chart/map.js +++ b/src/chart/map.js @@ -34,7 +34,7 @@ define(function (require) { //}, // mapValueCalculation: 'sum', // 数值合并方式,默认加和,可选为: // 'sum' | 'average' | 'max' | 'min' - mapValuePrecision: 0, // 地图数值计算结果小数精度 + // mapValuePrecision: 0, // 地图数值计算结果小数精度 showLegendSymbol: true, // 显示图例颜色标识(系列标识的小圆点),存在legend时生效 // selectedMode: false, // 选择模式,默认关闭,可选single,multiple dataRangeHoverLink: true, @@ -233,7 +233,8 @@ define(function (require) { valueData[mapType][name] = valueData[mapType][name] || { seriesIndex : [], - valueMap: {} + valueMap: {}, + precision: 0 }; for (var key in data[j]) { if (key != 'value') { @@ -245,6 +246,12 @@ define(function (require) { valueData[mapType][name].value == null && (valueData[mapType][name].value = 0); + valueData[mapType][name].precision = + Math.max( + this.getPrecision(+data[j].value), + valueData[mapType][name].precision + ); + valueData[mapType][name].value += (+data[j].value); valueData[mapType][name].valueMap[i] = +data[j].value; } @@ -268,14 +275,14 @@ define(function (require) { this.lastShapeList = []; } for (var mt in valueData) { - if (valueCalculation[mt] && valueCalculation[mt] == 'average') { - for (var k in valueData[mt]) { - valueData[mt][k].value = - (valueData[mt][k].value / valueData[mt][k].seriesIndex.length) - .toFixed( - mapValuePrecision[mt] - ) - 0; + for (var k in valueData[mt]) { + if (valueCalculation[mt] == 'average') { + valueData[mt][k].value /= valueData[mt][k].seriesIndex.length; } + valueData[mt][k].value = valueData[mt][k].value.toFixed( + mapValuePrecision[mt] == null + ? valueData[mt][k].precision : mapValuePrecision[mt] + ) - 0; } this._mapDataMap[mt] = this._mapDataMap[mt] || {}; diff --git a/src/component/base.js b/src/component/base.js index d9ebd96ef5..1af8faad91 100644 --- a/src/component/base.js +++ b/src/component/base.js @@ -236,7 +236,9 @@ define(function (require) { parsePercent: number.parsePercent, parseCenter: number.parseCenter, parseRadius: number.parseRadius, - numAddCommas: number.addCommas + numAddCommas: number.addCommas, + + getPrecision: number.getPrecision }; return Base; diff --git a/src/util/number.js b/src/util/number.js index 824a6ba7b9..aacc02816c 100644 --- a/src/util/number.js +++ b/src/util/number.js @@ -61,11 +61,31 @@ define(function() { return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,') + (x.length > 1 ? ('.' + x[1]) : ''); } + + /** + * 获取数字的小数位数 + * @param {number} val + */ + + // It is much faster than methods converting number to string as follows + // var tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + function getPrecision(val) { + var e = 1; + var count = 0; + while (((val * e) | 0) / e !== val) { + e *= 10; + count++; + } + return count; + } return { - parsePercent : parsePercent, - parseCenter : parseCenter, - parseRadius : parseRadius, - addCommas : addCommas + parsePercent: parsePercent, + parseCenter: parseCenter, + parseRadius: parseRadius, + addCommas: addCommas, + getPrecision: getPrecision }; }); \ No newline at end of file