通用精度处理方案(保留3位小数,各百分比和要保证为100%)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20086125/article/details/82793915

公用方法如下:

/**
 * @Description: 精度处理(如:%.2f表示保留后两位,它的处理方式也是直接截掉不要的尾数,不四舍五入)
 * @author 
 * @date 2018年09月04日 20:22:44
 * @param n 保留n位小数
 * @param d 原浮点数
 * @return 返回保留n位小数位数的字符串
 *
 */
public static String formatDoubleStr(int n,double d) {
   String str = String.format("%."+n+"f", d);
   return str;
}
/**
 * @Description: 获取组合数的百分比(各自占比和为100%)
 * @author 
 * @date 2018年09月20日 19:15:25
 * @param n 保留n位小数
 * @param doubleMap 除数
 * @param sum 被除数
 * @return
 *
 */
public static Map<String,Double> getPencentDoubleValue(int n, Map<String,Double> doubleMap, double sum) {
   //为空则返回null
   if(null==doubleMap||doubleMap.size()<0||sum==0){
      return null;
   }
   //截取的n+1尾数,用于判断四舍五入的精度问题
   Map<String,Double> allMap=new HashMap<>(doubleMap.size());
   Map<String,Double> maxMap=new HashMap<>(doubleMap.size());
   Map<String,Double> minMap=new HashMap<>(doubleMap.size());
   int di=0;
   String ds,dd,maxKey=null,minKey=null;
   double dv=0;
   for(String key : doubleMap.keySet()){
      ds=formatDoubleStr(n+1,doubleMap.get(key)/sum*100);
      dd=formatDoubleStr(n,doubleMap.get(key)/sum*100);
      di=Integer.valueOf(ds.substring(ds.length()-1,ds.length()));
      if(di>=5){
         maxMap.put(key,Double.valueOf(dd));
         maxKey=key;
      }else{
         minMap.put(key,Double.valueOf(dd));
         minKey=key;
      }
      dv+=Double.valueOf(dd);
      allMap.put(key,Double.valueOf(dd));
   }

   //计算和值,以决定增减
   if(dv>100&&maxMap.size()>0&&null!=maxKey){
      allMap.put(maxKey,Double.valueOf(formatDoubleStr(n,maxMap.get(maxKey)-(dv-100))));
   }else if(dv<100&&minMap.size()>0&&null!=minKey){
      allMap.put(minKey,Double.valueOf(formatDoubleStr(n,minMap.get(minKey)+(100-dv))));
   }

   return  allMap;
}

使用案例:

public static void main(String[] args) throws ParseException {

    Map<String,Double> percentMap =new HashMap<>(4);
    //double a=10.36,b=12.69,c=59.63,d=142.36;
    double a=0.01,b=25987.69,c=2588.63,d=14.36;
    percentMap.put("true",a);
    percentMap.put("arre",b);
    percentMap.put("lost",c);
    percentMap.put("coup",d);
    percentMap=getPencentDoubleValue(3,percentMap,a+b+c+d);
    System.out.println(a+b+c+d);
    System.out.println(percentMap.get("true"));
    System.out.println(percentMap.get("arre"));
    System.out.println(percentMap.get("lost"));
    System.out.println(percentMap.get("coup"));
}

控制台打印:

28590.69
0.0
90.896
9.054
0.05

猜你喜欢

转载自blog.csdn.net/qq_20086125/article/details/82793915