C#-位置后截断

C#-位置后截断,c#,C#,我有一个双类型变量。此变量存储作为更复杂公式一部分的信息。重要的是,该变量只能包含多达十分之一位置或一个小数点位置(即10.1、100.2等)的信息。但是,在确定该值时,必须对其进行计算,以使超过十分之一位置的任何内容都被截断,而不是四舍五入。例如: 如果该值等于10.44,则变量值应为10.4。 如果该值等于10.45,则变量值也应设置为10.4 如何截断C中相对于小数点的值?System.Math.truncate(d*10)/10您必须自己完成: public static dec

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

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


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

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

您必须自己完成:

    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);
    }
公共静态十进制截断(十进制值,整数小数)
{
如果((小数<0)| |(小数>28))
{
抛出新ArgumentOutOfRangeException(“小数”,“小数位数必须介于0和28之间”);
}
十进制积分=数学截断(值);
小数=数值-整数;
十进制移位=(十进制)数学功率(10,小数);
分数=数学截断(移位*分数);
分数=分数/移位;
收益率(整数+分数);
}

虽然我可能会使用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);
    }

使用扩展方法:

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

一般来说,如果您使用的是精确的十进制表示法很重要的数字,则应使用-not
double

使用
十进制
,您可以执行以下操作

decimal d = ...;
d = decimal.Truncate(d*10)/10;

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

这是舍入,不是截断这将截断为2位。我相信它必须是静态类中的静态方法,才能成为扩展方法当然,你是对的。我添加了static关键字。我省略了类声明,因为这很明显。