C# 电能修约计算公式方法

首次发布:2022-01-11 10:02
/// <summary>
/// 修约 
/// </summary>
/// <param name="d">平均值</param>
/// <param name="dj">等级(样例 1级:1,2级:2,0.5级:0.5) </param>
/// <returns></returns>
public string XiuYue(double d, double dj)
{//原创来自 http://www.luofenming.com/show.aspx?id=ART2022011100001
    string reslutStr = "";
    string f = "f2";
    if (dj == 1 || dj == 2)//等级为1或2时 保留一位小数  其它保留2位
    {
        f = "f1";
    }

    double result = d / dj;//平均误差 / 等级
    int temp = GetNumberOfDecimalPlaces(result);//获取小数位数
    if (temp == 2 && result.ToString().Substring(result.ToString().Length - 1) == "5")//判断 如果小数位=2,并且小数据尾数据=5
    {
        temp = (int)(result * 10);//获取小数点第一位  奇数还是偶数据
        if (temp % 2 == 0)//偶数
        {
            reslutStr = ((temp / 10.0) * dj).ToString(f);
        }
        else//奇数
        {
            reslutStr = ((temp + 1) / 10.0 * dj).ToString(f);
        }
    }
    else//否则  四舍五入
    {
        //result*10  --> 四舍五入  -->除以 10 -->乘以 等级--> 保留几位小数(相当保留1位小数的四舍五入/ 等级 然后根据等级保留 几位小数据)
        reslutStr = (Math.Round(result * 10, MidpointRounding.AwayFromZero) / 10 * dj).ToString(f);
    }

    return reslutStr;
}
/// <summary>
/// 获取小数位数
/// </summary>
/// <param name="decimalV">小数</param>
/// <returns></returns>
public int GetNumberOfDecimalPlaces(double decimalV)
{
    string[] temp = decimalV.ToString().Split('.');
    if (temp.Length == 2 && temp[1].Length > 0)
    {
        int index = temp[1].Length - 1;
        while (temp[1][index] == '0' && index-- > 0) ;
        return index + 1;
    }
    return 0;
}