我有一个双重类型的变量。该变量存储属于更复杂公式的信息。重要的是,这个变量只能包含十分之一的位置或一个小数位(即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