码迷,mamicode.com
首页 > 编程语言 > 详细

算法:四舍六入五成双 ,保留三位有效数字

时间:2014-10-24 18:05:33      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   ar   for   sp   数据   div   

/// <summary>
/// 格式化 Decimal 数字  用于有效计算
/// </summary>
/// <param name="ori"></param>
/// <returns></returns>
/// <remarks></remarks>
public static decimal FormatDecimal(decimal ori)
{
    if (ori == 0) {
        return 0;
    }

    decimal num = ori;
    decimal result = 0m;
    int zoome = 1;

    //小于100的数, 数字放大 10的  指数倍,直到 数字 大于等于100

    while (num < 100) {
        num = num * 10;
        zoome = zoome * 10;
    }

    int int1 = Math.Floor(num);
    decimal d1 = Math.Floor(num) + 0.5;

    // 四舍六入
    // 5 看尾数 和奇偶

    if (num > d1) {
        //如果 5后面有尾数, 进位
        result = int1 + 1;
    } else if (num == d1) {
        // 看前一位  偶数不变,奇数 +1
        if (int1 % 2 == 0) {
            result = int1;
        } else {
            result = int1 + 1;
        }
    } else {
        //整数
        result = int1;
    }

    //有效数字取到以后 缩小到原来的数量级
    result = result / zoome;
    return result;
}

/// <summary>
/// 格式化字符串显示 Decimal 数字
/// </summary>
/// <param name="ori"></param>
/// <returns></returns>
/// <remarks></remarks>
public static string ShowDecimal(decimal ori)
{

    if (ori == 0) {
        return "0";
    }
    //首先  得到 格式化之后的数据, 有效数字
    ori = FormatDecimal(ori);

    string strNum = "";
    decimal num = ori;

    //判断是不是 3位及3位以上数字 直接取整数部分

    if (num >= 100) {
        strNum = num.ToString();
    } else if (num > 0) {
        // 三位数以下, 涉及到 取小数点
        string s = num.ToString();
        // 没有小数点, 先补齐 小数点位数
        if (s.Contains(".")) {
            s = s + "00";
        } else {
            s = s + ".00";
        }


        // 遍历取 3位有效数字
        char[] array = s.ToCharArray();
        int start = 0;

        for (int i = 0; i <= array.Length - 1; i++) {
            if (start == 3) {
                break; // TODO: might not be correct. Was : Exit For
            }

            if (array[i] == ".") {
                strNum = strNum + ".";
            } else {
                int t = int.Parse(array[i]);
                if (t > 0) {
                    start = start + 1;
                    strNum = strNum + t;
                } else if (t == 0) {
                    if (start > 0) {
                        start = start + 1;
                        strNum = strNum + t;
                    } else {
                        strNum = strNum + t;
                    }
                }
            }
        }
    }


    return strNum;

}

 

算法:四舍六入五成双 ,保留三位有效数字

标签:style   blog   color   os   ar   for   sp   数据   div   

原文地址:http://www.cnblogs.com/LittleMing/p/4048715.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!