精华内容
下载资源
问答
  • js最大余额法

    2020-07-09 14:25:29
    js最大余额法:解决百分比和不到100%的问题 //valueList要计算的数组 //idx要计算数组中值的下表 //precision百分比保留几位小数 getPercentValue: function(valueList, idx, precision) { // 判断是否为空 if (!...

    js最大余额法:解决百分比和不到100%的问题

    //valueList要计算的数组
    //idx要计算数组中值的下表
    //precision百分比保留几位小数
    getPercentValue: function(valueList, idx, precision) {
        // 判断是否为空
        if (!valueList[idx]) {
            return 0;
        }
        // 求和
        let sum = valueList.reduce(function(acc, val) {
            return acc + (isNaN(val) ? 0 : val);
        }, 0);
        if (sum === 0) {
            return 0;
        }
        // 10的2次幂是100,用于计算精度。
        let digits = Math.pow(10, precision);
        // 扩大比例100,
        let votesPerQuota = valueList.map(function(val) {
            return (isNaN(val) ? 0 : val) / sum * digits * 100;
        });
        // 总数,扩大比例意味的总数要扩大
        let targetSeats = digits * 100;
        // 再向下取值,组成数组
        let seats = votesPerQuota.map(function(votes) {
            return Math.floor(votes);
        });
        // 再新计算合计,用于判断与总数量是否相同,相同则占比会100%
        let currentSum = seats.reduce(function(acc, val) {
            return acc + val;
        }, 0);
        // 余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组
        let remainder = votesPerQuota.map(function(votes, idx) {
            return votes - seats[idx];
        });
        // 给最大最大的余额加1,凑个占比100%;
        while (currentSum < targetSeats) {
            //  找到下一个最大的余额,给其加1
            let max = Number.NEGATIVE_INFINITY;
            let maxId = null;
            for (let i = 0, len = remainder.length; i < len; ++i) {
                if (remainder[i] > max) {
                    max = remainder[i];
                    maxId = i;
                }
            }
            // 对最大项余额加1
            ++seats[maxId];
            // 已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。
            remainder[maxId] = 0;
            // 总的也要加1,为了判断是否总数是否相同,跳出循环。
            ++currentSum;
        }
        // 这时候的seats就会总数占比会100%
        return seats[idx] / digits;
    }
    
    var arr= [3,4,5]
    getPercentValue(arr,0,2);//25
    getPercentValue(arr,1,2);//33.33
    getPercentValue(arr,2,2);//41.67
    
    展开全文
  • 最大余额法 参考文章最大余额法 php实现 //最大余额法 public function MaxBalance() { $data = [2,3,4]; $sum = array_sum($data); $res = []; foreach ($data as $key=>$item) { ...

    最大余额法

    参考文章最大余额法

    php实现

    /**
         * 最大余额法
         * @param array $data
         * @return array
         */
    
       function MaxBalance($data)
        {
            $sum = array_sum($data);
            $res = [];
            foreach ($data as $key=>$item) {
                $res[$key]['percent'] = ($item/$sum)*10000;
            }
            //取出小数点
            $result = [];
            foreach ($res as $key=>$value) {
    //            $tmp = explode('.', $value['percent']);
                $result[$value['percent']]['percent'] = $value['percent'];
                $tmp = explode('.', $value['percent']);
                $result[$value['percent']]['point'] = $tmp[1];
                $result[$value['percent']]['int'] = $tmp[0];
            }
            //小数点排序
            $sort = array_column($result, 'point');
            array_multisort($sort, SORT_DESC, $result);
            $int  = array_column($result,'int');
            $intSum = array_sum($int);
            $count = 10000 - $intSum;
            //余额排序分配席位
            foreach ($result as $key=>$value) {
                if($key < $count){
                    $result[$key]['int']  = ($result[$key]['int'] + 1)/100;
                } else {
                    $result[$key]['int']  = $result[$key]['int']/100;
                }
    
            }
        }
      var_dump(MaxBalance([2,3,4]));
    
    
    展开全文
  • 没办法只要去找方法,原本之前的项目是把剩余部分加到最大占比的地方,这次项目比较赶没做这方面的考虑,刚好饼图用Echarts发现他们相加刚好为100%,经过度娘,发现他们用的是最大余额法,就有了下面的方法,方法...

    项目中测试妹子报个bug:为什么饼图加起来不是100%;没办法只要去找方法,原本之前的项目是把剩余部分加到最大占比的地方,这次项目比较赶没做这方面的考虑,刚好饼图用Echarts发现他们相加刚好为100%,经过度娘,发现他们用的是最大余额法,就有了下面的方法,方法网上应该能搜到,只是加了自己的注释。感觉之后会用到,所以记录下。

       // 传入参数(数组数据,数组下标,精度),底下有例子调用
        var getPercentValue = function (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;
            }
            // 10的2次幂是100,用于计算精度。
            var digits = Math.pow(10, precision);
            // 扩大比例100,
            var votesPerQuota = valueList.map(function (val) {
                return (isNaN(val) ? 0 : val) / sum * digits * 100;
            })
            // 总数,扩大比例意味的总数要扩大
            var targetSeats = digits * 100;
            // 再向下取值,组成数组
            var seats = votesPerQuota.map(function (votes) {
                return Math.floor(votes);
            })
            // 再新计算合计,用于判断与总数量是否相同,相同则占比会100%
            var currentSum = seats.reduce(function (acc, val) {
                return acc + val;
            }, 0)
            // 余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组
            var remainder = votesPerQuota.map(function (votes, idx) {
                return votes - seats[idx];
            })
            // 给最大最大的余额加1,凑个占比100%;
            while (currentSum < targetSeats) {
                //  找到下一个最大的余额,给其加1
                var max = 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;
                    }
                }
                // 对最大项余额加1
                ++seats[maxId];
                // 已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。
                remainder[maxId] = 0;
                // 总的也要加1,为了判断是否总数是否相同,跳出循环。
                ++currentSum;
            }
            // 这时候的seats就会总数占比会100%
            return seats[idx] / digits
        }
    

    例子:

    var arr= [3,4,5]
    document.write( getPercentValue(arr,0,2) + "<br />")
    document.write( getPercentValue(arr,1,2) + "<br />")
    document.write( getPercentValue(arr,2,2) + "<br />")
    结果
    25
    33.33
    41.67
    

    项目图
    在这里插入图片描述

    如有错误,欢迎大佬的点评。

    展开全文
  • 在做某些计算的时候,需要百分比之和是100%,但是一般求和算百分比,都会保留2位小数...就是用到了最大余额法,解决了百分比总和不是100%的问题。 最大余额法计算方法: <script> /*** 使用方法****/ let a

    在做某些计算的时候,需要百分比之和是100%,但是一般求和算百分比,都会保留2位小数(默认四舍五入),所以很多时候相加不是100%的问题。
    我们看到echarts的环形图、饼图和其他带有百分比的图表,相加之和都是100%,就是用到了最大余额法,解决了百分比总和不是100%的问题。
    最大余额法计算方法:

      <script>
          /*** 使用方法****/
            let a = 16,
                b = 18,
                c = 24,
                arr = [a, b, c];
            //获取a所占的百分比,
            let aPercentage = getPercentValue(arr, 0, 2);
            //获取b所占的百分比,
            let bPercentage = getPercentValue(arr, 1, 2);
            //获取c所占的百分比,
            let cPercentage = getPercentValue(arr, 2, 2);
            //百分比之和
            let percentageSum = aPercentage + bPercentage + cPercentage;
            console.log('get percentage', aPercentage, bPercentage, cPercentage, percentageSum);
            
            /**** 最主要部分*****/
            //最大余额法解决百分比和不是100%的问题
            function getPercentValue(arrList, index, precision) {
                //arrList要计算数据的数组
                //index要计算数组中值的下表
                //precision百分比保留几位小数,默认保留2位小数
                // 判断是否为空
                if (!arrList[index]) {
                    return 0;
                }
                 if (!precision) precision = 2;
                // 求和
                let sum = arrList.reduce(function(acc, val) {
                    return acc + (isNaN(val) ? 0 : val);
                }, 0);
                if (sum === 0) {
                    return 0;
                }
                // 10的2次幂是100,用于计算精度。
                let digits = Math.pow(10, precision);
                // 扩大比例100,
                let votesPerQuota = arrList.map(function(val) {
                    return (isNaN(val) ? 0 : val) / sum * digits * 100;
                });
                // 总数,扩大比例意味的总数要扩大
                let targetSeats = digits * 100;
                // 再向下取值,组成数组
                let seats = votesPerQuota.map(function(votes) {
                    return Math.floor(votes);
                });
                // 再新计算合计,用于判断与总数量是否相同,相同则占比会100%
                let currentSum = seats.reduce(function(acc, val) {
                    return acc + val;
                }, 0);
                // 余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组
                let remainder = votesPerQuota.map(function(votes, index) {
                    return votes - seats[index];
                });
                // 给最大最大的余额加1,凑个占比100%;
                while (currentSum < targetSeats) {
                    //  找到下一个最大的余额,给其加1
                    let max = Number.NEGATIVE_INFINITY;
                    let maxId = null;
                    for (let i = 0, len = remainder.length; i < len; ++i) {
                        if (remainder[i] > max) {
                            max = remainder[i];
                            maxId = i;
                        }
                    }
                    // 对最大项余额加1
                    ++seats[maxId];
                    // 已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。
                    remainder[maxId] = 0;
                    // 总的也要加1,为了判断是否总数是否相同,跳出循环。
                    ++currentSum;
                }
                // 这时候的seats就会总数占比会100%
                return seats[index] / digits;
            }
        </script>
    
    展开全文
  • 1.在项目的过程中我们会经常的去计算一组数中每个数占这一组数...当然最大余额法并不一定是满足你的需求的,这个地方计算百分比的时候,最好还是跟客户进行沟通确认,确认过后才能进行这么操作。客户才是最终的上帝。
  • 环形图将总数放置在饼图中央,且鼠标悬浮图例可以显示提示信息,图例提示信息数据计算比例采用最大余额法计算 initEchartPie() initEchartPie(){ setTimeout(()=>{ const myCharts = this.$echarts.init(this...
  • 饼图各项相加100%

    2020-05-06 14:19:57
    //最大余额法使饼图各项相加的占比为100% getPercentValue = (valueList = [], { total, precision = 2 } = {}) => { //判空 if (!valueList.length) { return []; } //加法 求和 Decimal保证精度 const reduceFn...
  • 这里写自定义目录标题 做项目的时候发现,计算百分比的时候有时候不能相加等于百分之百,但发现echarts的饼图不管如何都是百分之百,...Echarts最大余额法使饼图各项相加的占比为100% 在utils中新建percent.js文件 e...
  • HDU 2546 饭卡余额大于等于5都可以买,给出饭卡买各种菜后使余额最小(可为负) 最优:先挑出最大的,饭卡金额减5再背包剩下的。
  • 换零钱的clojure实现

    2012-01-06 19:27:16
    题目:有半美元、四分之一美元、10美分、5美分和1美分的硬币,将1美元换成零钱,一共有... 100余额的所有换 = 采用50美分的所有换 + 不采用50美分的所有换    那么,我们首先来看采用50美分的换,既然...
  •  15.4.2 余额递减折旧图表分析 299  15.4.3 年限总和折旧图表分析 300  第16章 产品生产方案规划求解 302  16.1 建立规划求解问题模型 302  16.2 生产成本最小化规划求解 305  16.2.1 成本最小化规划求解 ...
  • 145 快速恢复以科学计数显示的商品条形码 296 146 将数字金额转换为人民币大写 298 147 将日期转换为中文大写 301 148 将员工提成工资转换为会计格式 302 149 根据工作年限计算员工年终奖 304 150 ...
  • 2.1.8 GCD——计算最大公约数 56 2.1.9 LCM——计算最小公倍数 57 2.1.10 SUMIF——按给定条件对指定单元格求和 57 2.1.11 SUMIFS——按多个条件对指定单元格求和 59 2.1.12 SUMPRODUCT——计算数组元素的乘积...
  • 用例9:使用余额递减计算任何期间的资产折旧值(VDB) 源文件:光盘\源文件\02\08.xlsx 用例10:计算第一时期的折旧值(AMORDEGRC) 源文件:光盘\源文件\02\09.xlsx 用例11:用函数AMORLINC计算第一时期的...
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
     实例30 求最大的随机数 44  3.5 switch语句 45  实例31 判断字母分类 46  实例32 优良及差 47  实例33 打印任意一年日历 48  实例34 一年四季的划分 51  第2篇 Java数据处理  第4章 异常处理(教学...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
     实例66 求最大值、最小值和平均值 91  5.2 二维数组 92  实例67 二维数组的创建与使用 92  实例68 矩阵转置 93  实例69 奇数阶幻方 94  实例70 求方阵对角线之和 96  实例71 矩阵的加法 97  ...
  • java范例开发大全

    2013-03-08 20:06:54
    实例249 余额查询 489 实例250 滚动的文字 492 实例251 漂浮效果 495 实例252 监视内存的使用情况 499 实例253 璀璨的星空 501 实例254 银行和超市业务的模拟 505 第14章 泛型(教学视频:43分钟) 511 14.1 泛型...
  • Java范例开发大全(全书源程序)

    热门讨论 2013-04-05 11:50:26
    实例249 余额查询 489 实例250 滚动的文字 492 实例251 漂浮效果 495 实例252 监视内存的使用情况 499 实例253 璀璨的星空 501 实例254 银行和超市业务的模拟 505 第14章 泛型(教学视频:43分钟) 511 14.1...
  • realplayer

    2010-08-18 10:57:02
    d) 不得试图将此“软件”用于,或同时用于任何规避技术手段,以规避访问控制或权利、内容文件或由其它任何版权所保护产品。 e) 按照美国法律要求此“软件”包含一系列复制管理系统。 您不得以任何方式规避或尝试...

空空如也

空空如也

1
收藏数 20
精华内容 8
关键字:

最大余额法