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

/// <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;

}
时间: 2024-11-05 18:42:23

算法:四舍六入五成双 ,保留三位有效数字的相关文章

JS toFixed 四舍六入五成双

以前一直以为toFixed就是四舍五入的方法,后来又有一段时间以为toFixed是五舍六入.今天终于写的时候,终于才知道toFixed是一个叫做四舍六入无成双的诡异的方法... 完全不明白为什么要这么写... 什么是四舍六入五成双:百度是这么说的: 对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是"四舍六入五成双",也即"4舍6入5凑偶"这里"四"是指≤4 时舍去,"六&q

四舍六入五成双并保留一位有效位-数据修约

/// <summary> /// 数据修约 -- 四舍六入5成双,至少保留一位有效位 /// 数值0.00512,保留2位,修约为0.01 /// </summary> /// <param name="modifyValue">原始数据</param> /// <param name="degit">保留位数</param> /// <returns></returns&g

四舍六入五成双(四舍六入奇偶效验)银行家算法

规则: 四舍六入五考虑. 五后非零就进一, 五后皆零看奇偶, 五前为偶应舍去, 五前为奇要进一. c#: Math.Round(new Decimal(1.2050),2) 1.2 Math.Round(new Decimal(1.2150),2) 1.22 Math.Round(new Decimal(1.2250),2) 1.22 Math.Round(new Decimal(1.2350),2) 1.24 Math.Round(new Decimal(1.2450),2) 1.24 Mat

Python3基础 format 四舍六入五凑偶 保留一位小数

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: #四舍 str1="{0:.1f}".format(27.54) str2="{0:.1f}".format(27.64) print(str1) print(str2) #六入 str1="{0:.1f}".format(27

Python3基础 str format 四舍六入五凑偶 保留一位小数

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? code [email protected]:~$ source activate py37 (py37) [email protected]:~$ ipython Python 3.7.0 (default, Jun 28 2018, 13:15:42) Type 'copyright'

四舍六入五成双银行家算法的 PHP和Javascript实现

四舍六入五成双 http://baike.baidu.com/view/1245064.htm?fr=aladdin 四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则. 对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1:当5后无有效数字时

C#四舍六入五留双

/// <summary> /// 小数保留位数处理 /// </summary> /// <param name="value">值</param> /// <param name="digitNum">保留位数</param> /// <param name="MR">数学舍入方法</param> /// <returns></r

C++ Ouput Exactly 2 Digits After Decimal Point 小数点后保留三位数字

在C++编程中,有时候要求我们把数据保留小数点后几位,或是保留多少位有效数字等等,那么就要用到setiosflags和setprecision函数,记得要包含头文件#include <iomanip>,请参考下面的示例: #include <iostream> #include <iomanip> // Need this using namespace std; int main() { float a = 4, b = 3, c = 2; cout <<

C# 转成金额每三位逗号隔开

long aaaa = 14200666; Console.WriteLine(aaaa.ToString("N0")); Console.WriteLine(string.Format("{0:N0}", 14200666));结果: 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元)string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0.20)默认格式化小数点后面保留两