C#保留三位有效数字

  • Post author:
  • Post category:其他


最近遇到问题是保留三位有效数字而不是保留三位小数。

例如:

输入:1234 输出:1234

1234.3 1234

12 12.0

4 4.00

1.3 1.30

1.235 1.24

1.245 1.24

0.001 0.00100

整理一下我找到的一些代码:

double是值,int是保留位数

方法1:

public double Retain(double d, int n)
        {
            if (d == 0.0) return 0;
            if (d > 1 || d < -1)
                n = n - (int)Math.Log10(Math.Abs(d)) - 1;
            else
                n = n + (int)Math.Log10(1.0 / Math.Abs(d));
            if (n < 0)
            {
                d = (int)(d / Math.Pow(10, 0 - n)) * Math.Pow(10, 0 - n);
                n = 0;
            }
            return Math.Round(d, n);
} 

2.用“G”的精度表示保留有效数字位数,例如保留4位

///保留4位有效数字

var arr = new double[] { 123.4567, 12345670, 12.34567, 0.001234567 };
 
foreach (var d in arr)
 
Console.WriteLine(d.ToString("G4"));

//输出结果

123.5

1.235E+07

12.35

0.001235

3.考虑到数据有可能整数,还有用“G”的精度表示保留有效数字位数子时,0多的数据会按科学计数法形式+“E”的数据。

 /// <summary>
        /// 保留有效数字
        /// </summary>
        /// <param name="bef"></param>
        /// <param name="digit"></param>
        /// <returns></returns>
        public static string ReturnBef(double bef, int digit)
        {
            if (bef == 0)
            {
                return "0";
            }
            var res = bef.ToString($"G{digit}");//G精度
            if (res.Contains("."))
            {
                var index = Regex.Match(res, "([1-9])").Index;
                var sub = res.Substring(index).Replace(".", "");
                var leg = sub.Length;
                while (leg < digit)
                {
                    res += "0";
                    leg++;
                }
            }
            else
            {
                int leg = res.ToString().Length;
                if (leg >= digit)
                {
                    return res;//返回整数
                }
                else
                {
                    res += ".";
                    while (leg < digit)
                    {
                        res += "0";
                        leg++;
                    }
                }
            }
            return res;
        }
 
 
 
///阻止科学计数法
 public static class FormatStrings
        {
            public const string DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################";
        }

例子:

string n1 = ReturnBef(Convert.ToDouble(o.INQ), 3).ToString();
                            if (n1.Contains("E"))//判是否包含“E”
                                GridView.Rows[row].Cells["INQ"].Value = (Convert.ToDouble(a).ToString(FormatStrings.DoubleFixedPoint));
                            else
                                GridView.Rows[row].Cells["INQ"].Value = ReturnBef(Convert.ToDouble(a), 3); 

4.有些数值没有进入方法,改进把精度取消

 public static string Rtues(double bef, int digit) 
        {
            if (bef == 0)//判断是否为0
            {
                return 0.ToString();
            }
            var res = bef.ToString();
            if (res.Contains("."))//判断小数
            {
                var index = Regex.Match(res, "([1-9])").Index;//
                var sub = res.Substring(index).Replace(".", "");
                var leg = sub.Length;
                while (leg < digit)
                {
                    res += "0";
                    leg++;
                }
            }
            else//判断整数
            {
                int leg = res.Length;
                if (leg >= digit)
                {
                    return res;
                }
                else
                {
                    res += ".";
                    while (leg < digit)
                    {
                        res += "0";
                        leg++;
                    }
                }
            }
            return res;
        } 

转载 https://blog.csdn.net/pixiuz/article/details/124836634