精华内容
下载资源
问答
  • 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();
    }

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

    展开全文
  • public static double[] getPercentValue(int[] arr){ //求和 double sum = 0; if(sum <= 0){ for (int i = 0; i < arr.length; i++) { sum += arr[i];... //102次幂是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计算百分比

    万次阅读 2014-12-25 09:22:25
    public String getPercent(int x,int total){  ...//接受百分比的值   double x_double=x*1.0;   double tempresult=x/total;   //NumberFormat nf = NumberFormat.getPercentInstance
    1. public String getPercent(int x,int total){  
    2.    String result="";//接受百分比的值  
    3.    double x_double=x*1.0;  
    4.    double tempresult=x/total;  
    5.    //NumberFormat nf   =   NumberFormat.getPercentInstance();     注释掉的也是一种方法  
    6.    //nf.setMinimumFractionDigits( 2 );        保留到小数点后几位  
    7.    DecimalFormat df1 = new DecimalFormat("0.00%");    //##.00%   百分比格式,后面不足2位的用0补齐  
    8.    //result=nf.format(tempresult);     
    9.    result= df1.format(tempresult);    
    10.    return result;  
    11. }  
    展开全文
  • JAVA计算百分比 格式化数字

    千次阅读 2011-01-09 21:33:00
    JAVA计算百分比 格式化数字 这个是我在程序...//接受百分比的值  double baiy=y*1.0;  double baiz=z*1.0;  double fen=baiy/baiz;  //NumberFormat nf = NumberFormat.getP

    JAVA中计算百分比 格式化数字

    这个是我在程序使用的例子:
    public String myPercent(int y,int z){
       String baifenbi="";//接受百分比的值
       double baiy=y*1.0;
       double baiz=z*1.0;
       double fen=baiy/baiz;
       //NumberFormat nf   =   NumberFormat.getPercentInstance();     注释掉的也是一种方法
       //nf.setMinimumFractionDigits( 2 );        保留到小数点后几位
       DecimalFormat df1 = new DecimalFormat("##.00%");    //##.00%   百分比格式,后面不足2位的用0补齐
        //baifenbi=nf.format(fen);   
       baifenbi= df1.format(fen);  
        return baifenbi;
    }

    这是在网上看到的资料,根绝可能对大家有帮助,所以就拿来了,呵呵:
    格式化输出数字
    翻译:Cherami
    email:cherami@163.net
    原文:http://developer.java.sun.com/developer/TechTips/2000/tt0411.html
    * 格式化输出数字
    格式化输出数字
    有时我们需要控制输出的数字的格式,如何使用java的类库做到这个呢?
    也许你不关心格式,但是你需要关心你的程序可以在全世界通用,像下面的这样一个简单的语句是依赖地区的:
         System.out.println(1234.56);
    美国,"." 是小数点,但在其它地方就不一定了。如何处理这个呢?

    java.text 包中的一些包可以处理这类问题。下面的简单范例使用那些类解决上面提出的问题:

         import java.text.NumberFormat;

         import java.util.Locale;

         public class DecimalFormat1 {

             public static void main(String args[]) {

                 // 得到本地的缺省格式

                 NumberFormat nf1 = NumberFormat.getInstance();

                 System.out.println(nf1.format(1234.56));

                 // 得到德国的格式

                 NumberFormat nf2 =

                     NumberFormat.getInstance(Locale.GERMAN);

                 System.out.println(nf2.format(1234.56));

             }

         }

    如果你在美国,运行程序后输出:

         1,234.56

         1.234,56

    换句话说,在不同的地方使用不同的习惯表示数字。

    NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类,例如DecimalFormat), 这适合根据本地设置格式化一个数字。你也可以使用非缺省的地区设置,例如德国。然后格式化方法根据特定的地区规则格式化数字。这个程序也可以使用一个简单的形式:

         NumberFormat.getInstance().format(1234.56)

    但是保存一个格式然后重用更加有效。国际化是格式化数字时的一个大问题。

    另一个是对格式的有效控制,例如指定小数部分的位数,下面是解决这个问题的一个简单例子:

         import java.text.DecimalFormat;

         import java.util.Locale;

         public class DecimalFormat2 {

             public static void main(String args[]) {

                 // 得到本地的缺省格式

                 DecimalFormat df1 = new DecimalFormat("####.000");

                 System.out.println(df1.format(1234.56));

                 // 得到德国的格式

                 Locale.setDefault(Locale.GERMAN);

                 DecimalFormat df2 = new DecimalFormat("####.000");

                 System.out.println(df2.format(1234.56));

             }

         }

    在这个例子中设置了数字的格式,使用像"####.000"的符号。这个模式意味着在小数点前有四个数字,如果不够就空着,小数点后有三位数字,不足用0补齐。程序的输出:

         1234.560

         1234,560

    相似的,也可以控制指数形式的格式,例如:

         import java.text.DecimalFormat;

         public class DecimalFormat3 {

             public static void main(String args[]) {

                 DecimalFormat df = new DecimalFormat("0.000E0000");

                 System.out.println(df.format(1234.56));

             }

         }

    输出:

         1.235E0003

    对于百分数:

         import java.text.NumberFormat;

         public class DecimalFormat4 {

             public static void main(String args[]) {

                 NumberFormat nf = NumberFormat.getPercentInstance();

                 System.out.println(nf.format(0.47));

             }

         }

    输出:

         47%

    至此,你已经看到了格式化数字的几个不同的技术。另一方面,如何读取并解析包含格式化的数字的字符串?解析支持包含在NumberFormat中。例如:

         import java.util.Locale;

         import java.text.NumberFormat;

         import java.text.ParseException;

         public class DecimalFormat5 {

             public static void main(String args[]) {

                 // 本地格式

                 NumberFormat nf1 = NumberFormat.getInstance();

                 Object obj1 = null;

                 // 基于格式的解析

                 try {

                     obj1 = nf1.parse("1234,56");

                 }

                 catch (ParseException e1) {

                     System.err.println(e1);

                 }

                 System.out.println(obj1);

                 // 德国格式

                 NumberFormat nf2 =

                     NumberFormat.getInstance(Locale.GERMAN);

                 Object obj2 = null;

                 // 基于格式的解析

                 try {

                     obj2 = nf2.parse("1234,56");

                 }

                 catch (ParseException e2) {

                     System.err.println(e2);

                 }

                 System.out.println(obj2);

             }

         }

    这个例子分两部分,都是解析一个字符串:"1234,56"。第一部分使用本地格式解析,第二部分使用德国格式解析。当程序在美国运行,结果是:

         123456

         1234.56

    换句话说,"1234,56"在美国被认为是一个巨大的整数"123456"而在德国被认为是一个小数"1234.56"。

    还有格式化讨论的最后一个问题。在上面的例子中, DecimalFormat 和 NumberFormat 都被使用了。DecimalFormat 常用于获得很好的格式控制,而NumberFormat 常用于指定不同于本地的地区。如何结合两个类呢?

    答案围绕着这样的事实:DecimalFormat是NumberFormat的一个子类,其实例被指定为特定的地区。因此,你可以使用NumberFormat.getInstance 指定一个地区,然后将结构强制转换为一个DecimalFormat对象。文档中提到这个技术可以在大多情况下适用,但是你需要用try/catch 块包围强制转换以防转换不能正常工作 (大概在非常不明显得情况下使用一个奇异的地区)。下面是一个这样的例子:

         import java.text.DecimalFormat;

         import java.text.NumberFormat;

         import java.util.Locale;

         public class DecimalFormat6 {

             public static void main(String args[]) {

                 DecimalFormat df = null;

                 // 得到一个NumberFormat 对象并

                 // 强制转换为一个 DecimalFormat 对象

                 try {

                     df = (DecimalFormat)

                         NumberFormat.getInstance(Locale.GERMAN);

                 }

                 catch (ClassCastException e) {

                     System.err.println(e);

                 }

                 // 设置格式模式

                 df.applyPattern("####.00000");

                 // format a number

                 System.out.println(df.format(1234.56));

             }

         }

     

    getInstance() 方法获得格式,然后调用applyPattern()方法设置格式模式,输出:

         1234,56000

    如果你不关心国际化,可以直接使用DecimalFormat 。

    展开全文
  • java 百分比计算

    2012-07-20 08:41:00
    需求:后台传入多个数值,需要计算各个数值占总值的百分比。 后台假设传入A、B、C 三个整数,这里我只求A占总数的百分比。 float sum = A+B+C; String result=""; //这里主要使用了 NumberFormat ...
  • public String getPercent(int x,int total){ String result="...//接受百分比的值 double x_double=x*1.0; double tempresult=x/total; //NumberFormat nf = NumberFormat.getPercentInstance...
  • java 百分比补偿

    2020-09-09 13:35:40
    我们很多的百分比都是几个值加载一起,然后...List paramList 需要计算百分比的小数 int lackNum 缺少的值 boolean flag true是加 false是减 public static Map<String,Integer> compensationProbability(List pa
  • java提供了两种方式计算百分比, int a = 3; int sum = 7; DecimalFormat df =new DecimalFormat("#0.00%"); //详细看DecimalFormat API, String format = df.format((float) a / (float) sum); //float或者...
  • 需求分析: 1.读取小说,把小说字储存在...3.定义方法,计算百分比 实现代码如下: package com.day04; import java.io.*/* * 案例:读一篇小说,统计每个字符出现次数,然后取出前十位,计算其占全文百分比 */ p
  • 问题在计算统计表格百分比的过程中,由于精度问题计算结果总是出现99.97%或是100.1%不等于100%的情况,最初的方案一般都是通过最后一个等于1减去百分比来完成计算,但这种方式存在弊端。经常出现异常数据,经过...
  • Java --计算百分比

    2019-10-05 10:43:22
    Learn From:... 方法一: public String getPercent(int x,int total){ String result = "";//接受百分比的值 double x_double = x*1.0; double te...
  • 计算统计表格百分比的过程中,由于精度问题计算结果总是出现99.97%或是100.1%不等于100%的情况,最初的方案一般都是通过最后一个等于1 减去百分比来完成计算,但这种方式存在弊端。经常出现异常数据,经过在...
  • 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
  • 我尝试在我随机林代码中测量MAPE(平均绝对百分比误差)。MAE为7.5。当我试图计算MAPE时,它输出:Accuracy: -inf %这是我计算MAPE代码。如何使它工作,或者为什么它不计算一个。在^{pr2}$以下是:errors:...
  • java int 求百分比 保证结果综合为1 直接取保留两位小数会导致数据之和不为 1 , 利用BigDecimal 取20 位 (根据需求取精度) ...注意,此舍入模式始终不会减少计算值的大小。 public static String formatP...
  • 问题在计算统计表格百分比的过程中,由于精度问题计算结果总是出现99.97%或是100.1%不等于100%的情况,最初的方案一般都是通过最后一个等于1减去百分比来完成计算,但这种方式存在弊端。经常出现异常数据,经过...
  • 如果将元素 writing-mode 设置为垂直书写模式(例如 vertical-lr ),则其后代在两个维度中填充和边距的百分比值将相对于高度而不是宽度 .. . . 边距和填充属性的百分比(总是根据CSS2.1中包含块宽度计算)是根据...
  • 需要用两个Integer型的值计算百分比,然后四舍五入转成Integer型,下面是最终的实现方法。 public class PercentCalculateUtils { private static final Integer HUNDRED = 100; public Integer getPercent...
  • Java的几何布朗运动

    2020-06-01 16:49:24
    Wiener过程是连续时间随机过程,以纪念Norbert Wiener命名。 通常用于用随机成分表示噪音或财务状况。 可以计算几何布朗运动以... 常规计算的扩展使用:m:每个时间段增值(在我情况下为月度)中断:分位数...
  • java常用工具类使用

    热门讨论 2012-03-19 20:11:37
    getPercentInstance() 获取显示百分比的格式。可以指定Local参数。比如:小数 0.53 将显示为 53%。 表8 获取NumberFormat对象 代码演示:NumberFormat进行数字格式化 import java.text.DecimalFormat; import ...
  • 模拟模型学习 几何布朗运动 维纳过程是一个连续时间随机过程,以纪念诺伯特·维纳。 通常用于用随机成分表示噪音或财务状况。... 常规计算的扩展使用:m:每个时间段增值(在我情况下为月度)中断:分...
  • 来源:金融界网站#概念及算法#ATR指标中文名...与其它震荡类指标不同,ATR计算的并不是百分比数值,而是每根K线从最高价到最低价真实价格差,所以也就不存在如20或者80这样关键临界。从笔者观察来看,ATR...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

java计算百分比的值

java 订阅