精华内容
下载资源
问答
  • 主要介绍了java计算百分比值的方法,涉及java数值运算的技巧,需要的朋友可以参考下
  • java计算百分比

    千次阅读 2020-11-18 09:55:13
    计算百分比 public class MathUtil { /** * 计算百分比,方法保证返回的map总百分比为100 * @param map 元数据map,key为数据项,value为该数据项分值 * @param sum 所有数据项总分值 * @return 计算后的百分比...

    计算百分比

    public class MathUtil {
        /**
         * 计算百分比,方法保证返回的map总百分比为100
         * @param map 元数据map,key为数据项,value为该数据项分值
         * @param sum 所有数据项总分值
         * @return 计算后的百分比map,key为数据项,value为对应百分比
         */
        public static HashMap<String, Integer> calcPercentage(Map<String, Integer> map, Integer sum) {
            //在四舍五入处理中四舍的key以及它们的损失数值
            List<Pair<String, Float>> loserList = new ArrayList<>();
            //在四舍五入处理中五入的key以及它们的收益数值
            List<Pair<String, Float>> gainerList = new ArrayList<>();
            HashMap<String, Integer> processedMap = new HashMap<>();
            Iterator<String> iterator = map.keySet().iterator();
            while (iterator.hasNext()) {
                String key = iterator.next();
                Integer value = map.get(key);
                float x = (float) value / (float) sum * 100;
                BigDecimal bigDecimal = new BigDecimal(x);
                //先按照四舍五入规则计算
                processedMap.put(key, bigDecimal.setScale(0, RoundingMode.HALF_UP).intValue());
                float y = x % 1;
                //计算损失或收益,并丢入对应map
                if (y >= 0.5) {
                    gainerList.add(Pair.of(key, 1 - y));
                } else {
                    loserList.add(Pair.of(key, y));
                }
            }
            //四舍五入处理后百分比数的和
            int processedSum = 0;
            for (Integer i : processedMap.values()) {
                processedSum += i;
            }
            //如果四舍五入处理后百分比数的和不足100,则对亏损者们依据亏损大到小依次进位
            if (processedSum < 100) {
                //需要处理的个数
                int dealCount = 100 - processedSum;
                Comparator<Pair<String, Float>> loserComparator = (Pair<String, Float> a, Pair<String, Float> b) -> {
                    if (Float.compare(a.getRight(), b.getRight()) == 0) {
                        //亏损相同时,初始数值大的优先,先正常比较大小,然后使用0减 是为了实现list从大到小排序
                        return 0 - Integer.compare(map.get(a.getLeft()), map.get(b.getLeft()));
                    } else {
                        //使用0减 是为了实现list从大到小排序
                        return 0 - Float.compare(a.getRight(), b.getRight());
                    }
                };
                loserList = loserList.stream().sorted(loserComparator).collect(Collectors.toList());
                for (int z = 0; z < dealCount; z++) {
                    String loserKey = loserList.get(z).getLeft();
                    processedMap.put(loserKey, processedMap.get(loserKey) + 1);
                }
            }
            //如果四舍五入处理后百分比数的和大于100,则对收益者们依据收益小到大依次取消进位处理
            if (processedSum > 100) {
                //需要处理的个数
                int dealCount = processedSum - 100;
                Comparator<Pair<String, Float>> gainerComparator = (Pair<String, Float> a, Pair<String, Float> b) -> {
                    if (Float.compare(a.getRight(), b.getRight()) == 0) {
                        //收益相同时,初始数值小的优先进行取消进位
                        return Integer.compare(map.get(a.getLeft()), map.get(b.getLeft()));
                    } else {
                        return Float.compare(a.getRight(), b.getRight());
                    }
                };
                gainerList = gainerList.stream().sorted(gainerComparator).collect(Collectors.toList());
                for (int z = 0; z < dealCount; z++) {
                    String gainerKey = gainerList.get(z).getLeft();
                    processedMap.put(gainerKey, processedMap.get(gainerKey) - 1);
                }
            }
            return processedMap;
        }
    }
    
    展开全文
  • java计算百分比方法

    千次阅读 2020-01-20 17:31:28
    我的方法可能有漏洞,可能不是最佳方法。后续待完善 ... ... * @description: 计算百分比,整数相除后的小数,只保留2位,并转成百分比 * 如:1/3=0.3333333,转成百分比后是33% * * @create: 20...

    我的方法可能有漏洞,可能不是最佳方法。后续待完善

    package com.example.demo.test;
    
    import java.text.DecimalFormat;
    
    /**
     * @description: 计算百分比,整数相除后的小数,只保留2位,并转成百分比
     *               如:1/3=0.3333333,转成百分比后是33%
     *
     * @create: 2020/01/20 17:12
     **/
    public class TestJava {
        public static void main(String[] args) {
            int a = 7;
            int b = 3;
            float result = (float)b/a;
            System.out.println(result);
    
            // 方式一 这种方式不够精确,没有四舍五入
            int resultNew = (int)(result * 100);
            System.out.println("方式一执行结果: " + resultNew);
    
            // 方式二 最佳方法
            DecimalFormat df = new DecimalFormat("0.00");
            String resultStr = df.format(result);
            System.out.println(resultStr);
            float resultFloat = Float.parseFloat(resultStr);
            int resultInt = (int)(resultFloat * 100);
            System.out.println("方式二执行结果: " + resultInt);
        }
    }
    
    展开全文
  • 1.在项目的过程中我们会经常的去计算一组数中每个数占这一组数的百分比,最近在项目的过程中就会遇到这个问题,一开始我们就简单粗暴的用这个数去除以这一组数的和得到一个保留几位小数的精确,这种计算方式在大...

    1.在项目的过程中我们会经常的去计算一组数中每个数占这一组数的百分比,最近在项目的过程中就会遇到这个问题,一开始我们就简单粗暴的用这个数去除以这一组数的和得到一个保留几位小数的精确值,这种计算方式在大部分的时候是没有问题的,但是也会在大多数情况下产生问题。

    最刚开始算法:

    NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) num1 / (float) num2 * 100);

    这种算法其实很多时候会出现问题,因为是根据精确值计算的,那么就会出现所有数的精确值加起来超过1  或者不足1的现象。

    如果 三个数  都是1  还有 3 ,3,5  那么和就是 99.99%   其实这种很多还有会超过100%的 

    需求:我们会在Echarts中引入大量的报表,Echarts中只需要把数据填进去就会自动的计算百分比,但是页面也需要展示百分比,以及后台还需要导出Excel。结果我刚开始的时候就用的这种算法去计算的,结果Echats和自己这种方式计算的就存在了一部分差异.最开始我也查了下百度,发现有一种算法,取这个数组中最大的值,让这个最大的值去进行加减操作使其最终的和等于100%。但是一顿操作确实也实现了  最终的结果是100%。但是发现echats官方并不是通过这个算法的.通过官方文档发现是通过最大余额法计算的。

    最大余额法的定义可以自寻百度解释。其实就是把这个数按照序数比例进行平分。然后把剩下的那些数在按照余数的最大值进行轮流均分。最大分配的是一个席位。直到把余下的序位分配完毕。

    这是我传入的七个数  12 ,11,5,5,3,3,2  通过上面的计算其实可以简单的概括就是

    把这一组数和相加得到值为:41    然后 依次除以41*10000  得到一组数。并且保留小数。

    2*10000/41=487.804847   3*10000/41 =731.7073170731 ....

    然后一次把这得到的余数  拆分:487.804847 :487 和0.804847   731.7073170731 :731和0.7073170731

    然后再把整数位相加 487+731+731...  最终结果为9995 

    然后再把这些小数放在一个数组中

    99995<10000  依次去找这个小数数组的最大值,小数数组最大值对应的整数值加1   依次循环直到最终的和为10000

    结束循环。然后再通过这个值去计算百分比。

    其实这就是最大余额法思路很简单。

    1.这组数和相加 2. 依次每一个数除以这组数和相加的结果  结果乘以10000 

    3. 拆分整数位和小数位  4.所有的整数位相加是否小于10000

    5.所有小数位最大值对应的整数位值加1  6.循环结束 计算百分比

    借助这个思路那么我们就开始写java方法就非常的简单了

    public static String getPercentValue(List<Integer> list,int index,int precision){
        if(CollectionUtils.isEmpty(list)){
            return "0";
        }
        //求和
        int listSum = 0;
        //for(int var : list){
            //listSum =add(listSum,var);
        //}
        double listSum = list.stream().mapToDouble(p -> p).sum();
        if(listSum == 0){
            return "0";
        }
        List<Double> seatsList = new ArrayList<>();//整数值
        List<Double> votesPerQuotaList = new ArrayList<>();//求小数得集合
        double currentSum =0;
        //10得二次幂是100用于计算精度
        double targetSeats = Math.pow(10,precision) *100;
        for(int val : list){
            //扩大比例100 用于计算
            //double result = divideToDouble((val * targetSeats),listSum);
            double result = val / sum * targetSeats;
            double seats = Math.floor(result);
            currentSum =add(currentSum,seats);//求总和
            seatsList.add (seats);//取整数位
            votesPerQuotaList.add(subtract(result,seats));//取小数位
        }
        //给最大得值加1 凑够占比100%
        while(currentSum < targetSeats){
            double max =0;int maxId =0;
            for(int i=0; i< votesPerQuotaList.size();i++){
                if(votesPerQuotaList.get(i) > max){
                    max = votesPerQuotaList.get(i);
                    maxId =i;
                }
            }
            //最大值加1 凑100
            seatsList.set(maxId,add(seatsList.get(maxId),1));
            votesPerQuotaList.set(maxId,0.0);//最大值小数位设为0
            currentSum = add(currentSum,1);
        }
         return calculatePercentage(seatsList.get(index), targetSeats);
    }
    public static String calculatePercentage(double num1,double num2){
        if(num1 ==0 || num2 ==0){
            return "0";
        }
        NumberFormat numberFormat = NumberFormat.getInstance();
        numberFormat.setMaximumFractionDigits(2);
        return numberFormat.format( num1 / num2 *100)+"";
    }
    public static double divideToDouble (double num1,int num2){
        if(num1 ==0 || num2 ==0){
            return 0.0f;
        }
        BigDecimal b1 = new BigDecimal(num1);
        BigDecimal b2 = new BigDecimal(num2);
        return b1.divide(b2,8,BigDecimal.ROUND_DOWN).doubleValue();
    }
    public static double add(double v1, double v2)
    {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }
    public static double subtract (double num1,double num2){
        BigDecimal b1 = new BigDecimal(num1);
        BigDecimal b2 = new BigDecimal(num2);
        return b1.subtract(b2).doubleValue();
    }

    当然最大余额法并不一定是满足你的需求的,这个地方计算百分比的时候,最好还是跟客户进行沟通确认,确认过后才能进行这么操作。客户才是最终的上帝。

    展开全文
  • java计算值所占的百分比,结果为100%

    千次阅读 2020-09-17 16:33:17
    public static double[] getPercentValue(int[] arr){ //求和 double sum = 0; if(sum <= 0){ for (int i = 0; i < arr.length; i++) { sum += arr[i];... //10的2次幂是100,用于计算精度。 dou
    public static double[] getPercentValue(int[] arr){
            //求和
    		double sum = 0;
            if(sum <= 0){
                for (int i = 0; i < arr.length; i++) {
                    sum += arr[i];
                }
            }
            //10的2次幂是100,用于计算精度。
            double digits = 1;
            //扩大比例100
            double[] votesPerQuota = new double[arr.length];
            for(int i = 0; i < arr.length; i++){
                double val = arr[i] / sum * digits * 100;
                votesPerQuota[i] = val;
            }
            //总数,扩大比例意味的总数要扩大
            double targetSeats = digits * 100;
            //再向下取值,组成数组
            double[] seats = new double[arr.length];
            for(int i = 0; i < votesPerQuota.length; i++){
                seats[i] = Math.floor(votesPerQuota[i]);
            }
            //再新计算合计,用于判断与总数量是否相同,相同则占比会100%
            double currentSum = 0;
            for (int i = 0; i < seats.length; i++) { 
                currentSum += seats[i];
            }
            //余数部分的数组:原先数组减去向下取值的数组,得到余数部分的数组
            double[] remainder = new double[arr.length];
            for(int i = 0; i < seats.length; i++){
                remainder[i] = votesPerQuota[i] - seats[i];
            }
            while(currentSum < targetSeats){
                double max = 0;
                int maxId = 0;
                for(int i = 0;i < remainder.length;++i){
                    if(remainder[i] > max){
                        max = remainder[i];
                        maxId = i;
                    }
                }
                //对最大项余额加1
                ++seats[maxId];
                //已经增加最大余数加1,则下次判断就可以不需要再判断这个余额数。
                remainder[maxId] = 0;
                //总的也要加1,为了判断是否总数是否相同,跳出循环。
                ++currentSum;
            }
            // 这时候的seats就会总数占比会100%
            return seats;
        }
    
    展开全文
  • java计算数据的百分比

    千次阅读 2020-12-17 15:19:11
    java计算数据的百分比 实现代码如下: import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class ...
  • 计算百分比工具类

    2021-02-26 15:11:36
    ###一 代码 public static String percentageConversion(long divisor, long dividend) { ...// 接受百分比 double y = divisor * 1.0; double z = dividend * 1.0; if (y == 0 || z == 0) { return "0.00%";
  • JAVA计算两数百分比的解决办法

    千次阅读 2017-09-12 13:53:48
    JAVA计算两数百分比的解决办法
  • java计算两个数的百分比

    千次阅读 2020-07-27 10:44:10
    double p3 = Double.valueOf(matchRows) / Double.valueOf(scanRows); NumberFormat nf = NumberFormat.getPercentInstance(); nf.setMinimumFractionDigits(2); String format = nf.format(p3);
  • long类型的两个值计算百分比

    千次阅读 2020-05-22 11:24:41
    private long getPercent(long count, long total) { if(total==0){ return 0; } BigDecimal currentCount = new BigDecimal(count); BigDecimal totalCount = new BigDecimal(total); BigDecimal divide = ...
  • import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class BaiFenBi2 { public static void main(String[] args) { BaiFenBi2 bf = new BaiFenBi2(); bf....
  • //接受百分比  double baiy=y*1.0;  double baiz=z*1.0;  double fen=baiy/baiz;  //NumberFormat nf = NumberFormat.getPercentInstance(); 注释掉的也是一种方法  //nf.setMinimumFractionDigits( 2 )...
  • JAVA计算百分比

    万次阅读 2011-05-03 17:04:00
    //接受百分比 double x_double=x*1.0; double tempresult=x/total; //NumberFormat nf = NumberFormat.getPercentInstance(); 注释掉的也是一种方法 //nf.setMinimumFractionDigits( 2 );
  • java提供了两种方式计算百分比, int a = 3; int sum = 7; DecimalFormat df =new DecimalFormat("#0.00%"); //详细看DecimalFormat API, String format = df.format((float) a / (float) sum); //float或者...
  • public String getPercent(int x,int total){ String result="...//接受百分比 double x_double=x*1.0; double tempresult=x/total; //NumberFormat nf = NumberFormat.getPercentInstance...
  • java 百分比计算

    2012-07-20 08:41:00
    需求:后台传入多个数值,需要计算各个数值占总值的百分比。 后台假设传入A、B、C 三个整数,这里我只求A占总数的百分比。 float sum = A+B+C; String result=""; //这里主要使用了 NumberFormat ...
  • java 计算百分比值

    2015-05-07 22:55:00
    [java] view plaincopy "code" class="java"> public class Test1 {  ... public static String myPercent(int y, int z) {  ...// 接受百分比   double ba
  • 随笔记:Java 计算两个数值百分比

    千次阅读 2017-07-26 15:41:44
    public String getnum(int num1,int num2){ NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); String result
  • 最近被提及Java中HashMap的一些实现及哈希冲突等,借鉴了一位老哥的部分解析,比较明白的展示hash算法的应用吧 结论: 对于String、Integer等类复写了Object中的hashCode方法的类来说,有各自的实现方法 Object类...
  • Java百分比% /** * 用于求百分比方法,已考虑除数不为0的情况 * @param number1 除数 * @param number2 被除数 * @param formatNumber 保留几位小数 * @return 百分比% */ public static double ...
  • java中实现百分比计算与显示

    千次阅读 2013-10-29 16:51:42
    import java.text.DecimalFormat; import java.text.NumberFormat; public class myPercent { public static String percnet(double d,double e){ double p = d/e; DecimalFormat nf = (DecimalFormat
  • 计算统计表格百分比的过程中,由于精度问题计算结果总是出现99.97%或是100.1%不等于100%的情况,最初的方案一般都是通过最后一个等于1 减去百分比来完成计算,但这种方式存在弊端。经常出现异常数据,经过在...
  • java计算两数百分比方法

    千次阅读 2009-10-16 17:47:00
    public static String percent( double p1, double p2) { String str; double p3 = p1 / p2; NumberFormat nf = NumberFormat.getPercentInstance(); nf.setMinimumFractionDigit
  • Java对两个int类型求百分比的方法

    万次阅读 2014-11-26 16:39:00
    今天制作一个统计报表导出功能,把Java对两个int类型求百分比的处理方法在博客整理一下,给后来有需要的人提供帮助!顺便纪念一下项目的统计功能基本没有问题,就差导出了! 现将代码整理如下:  int diliverNum=3;...
  • wxml: <view >{{ precent + '%'}}</view> <text >{{welfare_list.welfareDO.haveForestCoin}}/{{welfare_list.welfareDO.forestCoin}}森林币</text>... welfare_list: [...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,639
精华内容 12,255
关键字:

java计算百分比的值

java 订阅