C# - 在一个位置后截断

时间:2009-09-25 14:33:56

标签: c#

我有一个双类型变量。此变量存储的信息是更复杂公式的一部分。重要的是,该变量只能包括十分之一位置或一个小数位(即10.1,100.2等)的信息。但是,在确定此值时,必须对其进行计算,使得超过十分之一位置的任何内容都被截断,而不是四舍五入。例如:

如果值等于10.44,则变量值应为10.4。 如果值等于10.45,则变量值也应设置为10.4

如何相对于小数位截断C#中的值?

5 个答案:

答案 0 :(得分:6)

使用扩展方法:

public static double RoundDown(this double value, int digits)
{
     int factor = Math.Pow(10,digits);

     return Math.Truncate(value * factor) / factor;
}

然后你只需使用它:

double rounded = number.RoundDown(2);

答案 1 :(得分:0)

System.Math.Truncate(d * 10)/ 10

答案 2 :(得分:0)

你必须自己做这件事:

    public static decimal Truncate(decimal value, int decimals)
    {
        if ((decimals < 0) || (decimals > 28))
        {
            throw new ArgumentOutOfRangeException("decimals", "The number of fractional decimals must be between 0 and 28.");
        }

        decimal integral = Math.Truncate(value);
        decimal fractional = value - integral;
        decimal shift = (decimal)Math.Pow(10, decimals);

        fractional = Math.Truncate(shift * fractional);
        fractional = fractional / shift;

        return (integral + fractional);
    }

答案 3 :(得分:0)

虽然我可能会使用Phillippe的答案,如果你想避免缩放数字(不太可能是1dp的问题),你可以:

    public static double RoundDown(this double x, int numPlaces)
    {
        double output = Math.Round(x, numPlaces, MidpointRounding.AwayFromZero);
        return (output > x ? output - Math.Pow(10, -numPlaces) : output);
    }

答案 4 :(得分:0)

通常,如果您使用精确十进制表示很重要的数字,则应使用decimal - 而不是double

使用decimal,您可以执行类似...

的操作
decimal d = ...;
d = decimal.Truncate(d*10)/10;

如果您使用double值,则截断的数字通常不会精确表示 - 您最终可能会出现多余的数字或较小的舍入错误。例如,Math.Truncate((4.1-4.0)*10)不是1,而是0。