C# 设置双精度格式,仅显示4位数字

C# 设置双精度格式,仅显示4位数字,c#,string,string-formatting,C#,String,String Formatting,是否有一种方法可以格式化一个总是由用户指定的n位数的双倍数字 例如,如果用户希望始终看到4位数字,请以以下数字为例: Original Formatted ------- --------- 3.42421 3.424 265.6250 265.6 812.50 812.5 12.68798 12.68 0.68787 0.687

是否有一种方法可以格式化一个总是由用户指定的
n
位数的双倍数字

例如,如果用户希望始终看到4位数字,请以以下数字为例:

Original             Formatted
-------             ---------
3.42421             3.424
265.6250            265.6
812.50              812.5
12.68798            12.68
0.68787             0.687
我编造了这个,但它只允许浮点数!这不是我想要的

    public string ToEngV(double d, int percision = 0)
    {
        string zeros = string.Empty;

        if (percision <= 0)
        {
                zeros += "0";
        }
        else if (percision > 0)
        {
            for (int i = 0; i < percision; i++)
            {
                zeros += "0";
            }
        }

       return String.Format("{0:0." + zeros + "}", d) 
     }
公共字符串ToEngV(双d,整数感知=0)
{
字符串零=string.Empty;
如果(感知0)
{
for(int i=0;i
想象一下,我调用上面的方法处理一个像
812.50
这样的数字,并将精度设置为(这现在用于我要格式化的所有数字)。显然,输出将是
812.5

但是如果我给另一个数字,比如
1.61826
,我会得到
1.6
,这会破坏我向用户显示这些数字的页面格式。我需要的是
1.618


因此,我希望我的方法始终显示
N
数字

我不确定这是否是您要搜索的内容,无论如何,请尝试一下:

    string FmtDbl(double num, int digits)
    {
        digits++; // To include decimal separator
        string ret = num.ToString();
        if (ret.Length > digits) return ret.Substring(0, digits);
        else return ret + new String('0', digits - ret.Length);
    }

请注意,如果您的号码的位数超过整数位数,则此操作无效…

我不确定这是否是您要搜索的内容,请尝试一下:

    string FmtDbl(double num, int digits)
    {
        digits++; // To include decimal separator
        string ret = num.ToString();
        if (ret.Length > digits) return ret.Substring(0, digits);
        else return ret + new String('0', digits - ret.Length);
    }

请注意,如果您的数字的位数超过整数位数,则此操作不起作用…

以下内容如何:

d.ToString().PadRigth(4,'0').SubString(0,4);

比如说:

d.ToString().PadRigth(4,'0').SubString(0,4);

我不确定您是否要求对数字进行四舍五入或截断,因此我编写了以下方法:

public static string ToEngV(this double d, int digits, bool round)
{
    var lenght = Math.Truncate(d).ToString().Length;

    if (lenght > digits)
    {
        throw new ArgumentException("...");
    }

    int decimals = digits - lenght;

    if (round)
    {
        return Math.Round(d, decimals).ToString();
    }
    else
    {
        int pow = (int)Math.Pow(10, decimals);
        return (Math.Truncate(d * pow) / pow).ToString();
    }
}
例如:

var numbers = new double[] { 3.42421, 265.6250, 812.50, 12.68798, 0.68787 };
foreach (var number in numbers)
{
    Console.WriteLine(number.ToEngV(4, false));
}
Console.WriteLine()
foreach (var number in numbers)
{
    Console.WriteLine(number.ToEngV(4, true));
}
输出:

3.424
265.6
812.5
12.68
0.687

3.424
265.6
812.5
12.69
0.688

请注意,如果您的数字的整数位数多于
位数
,您将得到
ArgumentException

我不确定您是否要求对数字进行舍入或截断,因此我编写了以下方法:

public static string ToEngV(this double d, int digits, bool round)
{
    var lenght = Math.Truncate(d).ToString().Length;

    if (lenght > digits)
    {
        throw new ArgumentException("...");
    }

    int decimals = digits - lenght;

    if (round)
    {
        return Math.Round(d, decimals).ToString();
    }
    else
    {
        int pow = (int)Math.Pow(10, decimals);
        return (Math.Truncate(d * pow) / pow).ToString();
    }
}
number.ToString("#0.000").Substring(0, 5);
例如:

var numbers = new double[] { 3.42421, 265.6250, 812.50, 12.68798, 0.68787 };
foreach (var number in numbers)
{
    Console.WriteLine(number.ToEngV(4, false));
}
Console.WriteLine()
foreach (var number in numbers)
{
    Console.WriteLine(number.ToEngV(4, true));
}
输出:

3.424
265.6
812.5
12.68
0.687

3.424
265.6
812.5
12.69
0.688

请注意,如果您的数字的整数位数多于
位数
,您将得到一个
参数异常

,您能指定什么在这里不起作用吗?你失去了精度吗?我现在试图解释更多…是的,我也失去了进动对不起,812.50是怎么变成812.1的?你能具体说明什么在这里不起作用吗?你失去精度了吗?我现在试图解释更多…是的,我也失去了进动对不起,812.50是怎么变成812.1的?
number.ToString("#0.000").Substring(0, 5);