版权声明:本文为博主原创文章,未经博主允许不得转载。 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