此方法主要是一个一个类型去做计算
先创建一个实体类,来做计算的值去
package com.jdz.mediate_web.model.dto;
import lombok.Data;
@Data
public class ProportionRiskLevel {
/**
* 风险类型
*/
private String type;
/**
* 从数据库计算获得正常值
*/
private double normalDate;
/**
* 放大倍数值
*/
private double amplifiedData;
/**
* 放大倍数整数值
*/
private Long amplifiedIntegerData;
/**
* 放大倍数小数
*/
private double fractionalPart;
}
当创建了基本值计算的实体类后,将获取到的值进行基本运算
private ProportionRiskLevel proportionNumber(String type, Integer number, Integer sum){
ProportionRiskLevel proportionRiskLevel = new ProportionRiskLevel();
//除法,将数量去除总数量,得到的值放大10000倍
double doubleValue = new BigDecimal(number.toString()).divide(new BigDecimal(sum.toString()), 20, ROUND_UP)
.multiply(new BigDecimal(10000)).doubleValue();
proportionRiskLevel.setAmplifiedData(doubleValue);
long longValue = (long) doubleValue;
proportionRiskLevel.setAmplifiedIntegerData(longValue);
// 原数减去整数部分,为小数部分
double fractionalPart = new BigDecimal(String.valueOf(new Double(doubleValue))).subtract(new BigDecimal(longValue)).doubleValue();
proportionRiskLevel.setFractionalPart(fractionalPart);
proportionRiskLevel.setType(type);
return proportionRiskLevel;
}
在处理占百分比的时候,我使用的单个单个值得处理,但是先获取到所有值进行一个计算,计算后得值会进行一个倒叙,因为当其有正好可以整除得值不进行倒叙处理,整数值就会进行加1处理
拿放大倍数得值减掉放大倍数得整数值,正常会得到误差数得值,得到放大倍数得整数值进行+1处理
//排序
List<ProportionRiskLevel> proportionRiskLevelListDesc = proportionRiskLevelList.stream()
.sorted(Comparator.comparing(ProportionRiskLevel::getFractionalPart).reversed()).collect(Collectors.toList());
double sumOriginalData = proportionRiskLevelListDesc.stream().mapToDouble(ProportionRiskLevel::getAmplifiedData).summaryStatistics().getSum();
double sumNumberData = proportionRiskLevelListDesc.stream().mapToDouble(ProportionRiskLevel::getAmplifiedIntegerData).summaryStatistics().getSum();
long longValue = new BigDecimal(sumOriginalData).subtract(new BigDecimal(sumNumberData)).setScale(0, ROUND_UP).longValue();
if (longValue >= 0){
for (int i=0;i<proportionRiskLevelListDesc.size();i++){
ProportionRiskLevel proportionRiskLevel = proportionRiskLevelListDesc.get(i);
if (i < longValue){
proportionRiskLevel.setAmplifiedIntegerData(proportionRiskLevel.getAmplifiedIntegerData()+1);
}
proportionRiskLevel.setNormalDate((double) proportionRiskLevel.getAmplifiedIntegerData() / 100);
}
}
目前这个方法适用于超出百分比得值,当低于百分比得值需要做处理得时候,可以根据具体情况来做对应处理