计算各污染物算法



import com.threeclear.api.common.tool.method.ClearPolVarBean;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;


/**
 * @author yaoxh
 * @time 
 * 功能:公共计算方法
 */
public class ClearCalUtil {
   /**
    * @author yaoxh
    * @time 2015-11-11 下午5:47:23
    * @param type 污染物类型
    * @param C 浓度
    * @return
    * 功能:计算SO2、NO2、PM2.5、PM10、CO和O3_8h的指数
    */
   public static double scalIndex(String type, double C){
      double result = 0;
      try {
         int S = 0;
         if(ClearPolVarBean.SO2.equals(type)){
            S = 60;
         } else if(ClearPolVarBean.NO2.equals(type)){
            S = 40;
         } else if(ClearPolVarBean.PM10.equals(type)){
            S = 70;
         } else if(ClearPolVarBean.PM25.equals(type)){
            S = 35;
         } else if(ClearPolVarBean.CO.equals(type)){
            S = 4;
         } else if(ClearPolVarBean.O3_8h.equals(type)||ClearPolVarBean.O3.equals(type)){
            S = 160;
         }
         result = C/S;
      } catch (Exception e) {
         e.printStackTrace();
      }
      return result;
   }
   /**
    * @author yaoxh
    * @time 2015-11-11 下午6:00:36
    * @param percentile 特定百分位
    * @param numericalList 所有数据
    * @return
    * 功能:计算特定百分位数值
    */
   public static double scalPercentile(double percentile, List<Double> numericalList){
      double result = 0;
      try {
         if(numericalList!=null&&numericalList.size()>0){
            int count = numericalList.size();
            if(count==1){
               result = numericalList.get(0);
            } else {
               double[] orderArray = new double[count];
               for(int i=0;i<count;i++){
                  orderArray[i] = numericalList.get(i);
               }
               //排序
               Arrays.sort(orderArray);
               double mark = count*percentile;
               int min = (int)Math.floor(mark);
               int max = (int)Math.ceil(mark);
               if(min==max){
                  result = orderArray[min-1];
               } else {
                  result = orderArray[min-1]*(max-mark)+orderArray[max-1]*(mark-min);
               }
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
      return result;
   }
   /**
    * @author yaoxh
    * @time 2015-8-20 上午9:30:23
    * @param value 需要科学计算的数据
    * @param digit 保留的小数位
    * @return
    * 功能:四舍六入五成双计算法
    */
   public static String sciCal(double value, int digit){
      String result = "-999";
      try {
         double ratio = Math.pow(10, digit);
         boolean isNegative = false;
         if(value<0) {
            isNegative = true;
            value = Math.abs(value);
         }
         double _num = value * ratio;
         double mod = _num % 1;
         double integer = Math.floor(_num);
         double returnNum;
         if(mod > 0.5){
            returnNum=(integer + 1) / ratio;
          }else if(mod < 0.5){
             returnNum=integer / ratio;
          }else{
             returnNum=(integer % 2 == 0 ? integer : integer + 1) / ratio;
          }
         BigDecimal bg = new BigDecimal(returnNum); 
         result = bg.setScale((int)digit, BigDecimal.ROUND_HALF_UP).toString();
         if(isNegative) {
            result = "-" + result;
         }
      } catch (RuntimeException e) {
         throw e;
      }
      return result;
   }
   /**
    * @author yaoxh
    * @time 2015-8-29 下午5:48:12
    * @param value 需要计算的数字
    * @param place 多少位取整(1:个位,10:十位,100:百位依次类推)
    * @param digit 保留小树位数
    * @return
    * 功能:进位取整
    */
   public static String ceiling(double value, int place, int digit){
      String result = "-999";
      try {
         double ratio = Math.pow(10, (place+"").length()-1);
         double _num = value / ratio;
         double mod = _num % 1;
         double integer = Math.floor(_num);
         double returnNum = 0;
         if(mod > 0){
            returnNum=(integer + 1) * ratio;
          }else if(mod <= 0){
             returnNum=integer * ratio;
          }
         BigDecimal bg = new BigDecimal(returnNum); 
         result = bg.setScale(digit, BigDecimal.ROUND_HALF_UP).toString();
      } catch (RuntimeException e) {
         throw e;
      }
      return result;
   }
   /**
    * @author yaoxh
    * @time 2015-8-21 下午3:25:50
    * @param type 污染物类型(SO2、NO2、CO、PM10和PM2.5)
    * @param pol 污染物浓度
    * @return
    * 功能:计算污染物日均IAQI(包括PM10和PM2.5的24小时滑动平均)
    */
   public static double getDailyIAQI(String type, double pol){
      double polIAQI = 0;
      try {
         //按标志保留特定数值
         if(ClearPolVarBean.CO.equals(type)){
            pol = Double.parseDouble(ClearCalUtil.sciCal(pol, 3));
         } else {
            pol = Double.parseDouble(ClearCalUtil.sciCal(pol, 0));
         }
         if(pol<0){
            return -999;
         }
         double iaqih = 0;
         double iaqil = 0;
         double ph = 0;
  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值