CSharp - C# 如何在不舍入的情况下将双精度转换为小数点

  显示原文与译文双语对照的内容
0 0

没有它我需要格式化一个double值转换为一个小数位数舍入。

double value = 3.984568438706
string result = "";

我试过的是:

1 )

result = value.ToString("##.##", System.Globalization.CultureInfo.InvariantCulture) + "%"; 
// returns 3.98%

2 )

result = value.ToString("##.#", System.Globalization.CultureInfo.InvariantCulture) + "%"; 
// returns 4%

3 )

 result = value.ToString("##.0", System.Globalization.CultureInfo.InvariantCulture) + "%"; 
 // returns 4.0%

4 ) ( Following其他建议)

value = (value / 100);
result = String.Format("{0:P1}", Math.Truncate(value * 10000) / 10000);
// returns 4.0%
result = string.Format("{0:0.0%}",value); // returns 4.0%

我需要显示的是值3 .9%

提前谢谢你帮忙

时间:原作者:8个回答

0 0
result=string.Format("{0:0.0}",Math.Truncate(value*10)/10);
原作者:
0 0

我做一个实用工具方法可以处理此种情况:

static double Truncate(double value, int digits)
{
    double mult = System.Math.Pow(10.0, digits);
    return System.Math.Truncate(value * mult) / mult;
}

然后,可以执行以下操作:

result = Truncate(value, 1).ToString("##.#", System.Globalization.CultureInfo.InvariantCulture) + "%"; 

请注意,你可能也需要 Math .Floor 而不是截断但这要看你希望负值

原作者:
0 0

tostring( ) 不这样做。 你必须添加额外的代码。 其他答案显示math方法,下面我approch有点创造性思维。

string result = value.ToString();
Console.WriteLine("{0}", result.Substring(0,result.LastIndexOf('.')+2));

这是个很简单暴力的方法,但它应用了上述的技巧时,小数点是','。 下面是一个扩展方法来缓解这种疼痛( 和对待小数点) 。

public static class Extensions
{
    public static string ToStringNoTruncate(this double me, int decimalplaces = 1)
    {
        string result = me.ToString();
        char dec = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
        return result.Substring(0, result.LastIndexOf(dec) + decimalplaces + 1);
    }
}
原作者:
0 0
( Math.Truncate( ( value * 10 ) ) / 1000 ).ToString( "#.#%" )
原作者:
0 0

只需使用取模运算符+ 内建ToString :

result = (value - (value % 0.1)).ToString("N1") + "%";
原作者:
0 0

我知道这是个老的线程,但是我刚刚为了生存,不得已而为之。 而方法在这里工作我要简单的方法能够对很多调用所以使用Math .Truncate在所有调用string 。format其实不是一种好的选择。

因此,我做了一个自定义格式提供程序,让我可以添加截断到格式化字符串,eg

string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12
string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123
string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9

该实现十分简单,可以很容易地extendible到其他要求。

public class FormatProvider : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof (ICustomFormatter))
        {
            return this;
        }
        return null;
    }
    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (arg.GetType() != typeof (double))
        {
            try
            {
                return HandleOtherFormats(format, arg);
            }
            catch (FormatException e)
            {
                throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
            }
        }
        if (format.StartsWith("T"))
        {
            int dp = 2;
            int idx = 1;
            if (format.Length > 1)
            {
                if (format[1] == '(')
                {
                    int closeIdx = format.IndexOf(')');
                    if (closeIdx > 0)
                    {
                        if (int.TryParse(format.Substring(2, closeIdx - 2), out dp))
                        {
                            idx = closeIdx + 1;
                        }
                    }
                    else
                    {
                        throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
                    }
                }
            }
            double mult = Math.Pow(10, dp);
            arg = Math.Truncate((double)arg * mult) / mult;
            format = format.Substring(idx);
        }
        try
        {
            return HandleOtherFormats(format, arg);
        }
        catch (FormatException e)
        {
            throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
        }
    }
    private string HandleOtherFormats(string format, object arg)
    {
        if (arg is IFormattable)
        {
            return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture);
        }
        return arg != null ? arg.ToString() : String.Empty;
    }
}
原作者:
...