我有一个双类型变量。此变量存储的信息是更复杂公式的一部分。重要的是,该变量只能包括十分之一位置或一个小数位(即10.1,100.2等)的信息。但是,在确定此值时,必须对其进行计算,使得超过十分之一位置的任何内容都被截断,而不是四舍五入。例如:
如果值等于10.44,则变量值应为10.4。 如果值等于10.45,则变量值也应设置为10.4
如何相对于小数位截断C#中的值?
答案 0 :(得分: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);
答案 1 :(得分:0)
System.Math.Truncate(d * 10)/ 10
答案 2 :(得分: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);
}
答案 3 :(得分:0)
虽然我可能会使用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);
}
答案 4 :(得分:0)
通常,如果您使用精确十进制表示很重要的数字,则应使用decimal
- 而不是double
。
使用decimal
,您可以执行类似...
decimal d = ...;
d = decimal.Truncate(d*10)/10;
如果您使用double
值,则截断的数字通常不会精确表示 - 您最终可能会出现多余的数字或较小的舍入错误。例如,Math.Truncate((4.1-4.0)*10)
不是1,而是0。