2009-09-25 47 views
2

我有一个双重类型的变量。该变量存储属于更复杂公式的信息。重要的是,这个变量只能包含十分之一的位置或一个小数位(即10.1,100.2等)的信息。但是,在确定此值时,必须计算该值,以便超出十分之一的位置被截断,而不是四舍五入。例如:C# - 在位置后截断

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

如何截断C#中的小数点位置的值?

回答

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

我相信它需要是静态类中的静态方法,因为它是扩展方法 – JDunkerley 2009-09-25 15:08:18

+0

当然,你是对的。我添加了静态关键字。我非常明显地忽略了类声明。 – 2009-09-25 18:11:18

0

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

+0

这会截断为2位数 – 2009-09-25 14:44:26

+0

糟糕,误读了这个问题。现在更正。 – 2009-09-25 14:46:33

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

虽然我可能会使用菲利普的回答,如果你想避免结垢人数达(不太可能成为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); 
    } 
+1

这是四舍五入的,并非截断 – 2009-09-25 14:41:01

+0

修正了它,误读了这个问题 – JDunkerley 2009-09-25 15:07:13

0

一般来说,如果你与数字打交道,其中精确的十进制表示是很重要的,你应该使用decimal - 不double

随着decimal,你可以这样做......

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

如果使用double价值,您截断数量通常不会精确地表示的 - 你可能最终与过量数字或小的舍入误差。例如Math.Truncate((4.1-4.0)*10)不是1,而是0.