2009-09-25 73 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.