我有一個雙重類型的變量。該變量存儲屬於更復雜公式的信息。重要的是,這個變量只能包含十分之一的位置或一個小數位(即10.1,100.2等)的信息。但是,在確定此值時,必須計算該值,以便超出十分之一的位置被截斷,而不是四捨五入。例如:C# - 在位置後截斷
如果值等於10.44,則變量值應爲10.4。 如果值等於10.45,變量值也應該設置爲10.4
如何截斷C#中的小數點位置的值?
我有一個雙重類型的變量。該變量存儲屬於更復雜公式的信息。重要的是,這個變量只能包含十分之一的位置或一個小數位(即10.1,100.2等)的信息。但是,在確定此值時,必須計算該值,以便超出十分之一的位置被截斷,而不是四捨五入。例如:C# - 在位置後截斷
如果值等於10.44,則變量值應爲10.4。 如果值等於10.45,變量值也應該設置爲10.4
如何截斷C#中的小數點位置的值?
使用擴展方法:
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);
System.Math.Truncate(d * 10)/ 10
這會截斷爲2位數 – 2009-09-25 14:44:26
糟糕,誤讀了這個問題。現在更正。 – 2009-09-25 14:46:33
你要做的是通過你自己:
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);
}
雖然我可能會使用菲利普的回答,如果你想避免結垢人數達(不太可能成爲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);
}
這是四捨五入的,並非截斷 – 2009-09-25 14:41:01
修正了它,誤讀了這個問題 – JDunkerley 2009-09-25 15:07:13
一般來說,如果你與數字打交道,其中精確的十進制表示是很重要的,你應該使用decimal
- 不double
。
隨着decimal
,你可以這樣做......
decimal d = ...;
d = decimal.Truncate(d*10)/10;
如果使用double
價值,您截斷數量通常不會精確地表示的 - 你可能最終與過量數字或小的舍入誤差。例如Math.Truncate((4.1-4.0)*10)
不是1,而是0.
我相信它需要是靜態類中的靜態方法,因爲它是擴展方法 – JDunkerley 2009-09-25 15:08:18
當然,你是對的。我添加了靜態關鍵字。我非常明顯地忽略了類聲明。 – 2009-09-25 18:11:18