C#-位置后截断
我有一个双类型变量。此变量存储作为更复杂公式一部分的信息。重要的是,该变量只能包含多达十分之一位置或一个小数点位置(即10.1、100.2等)的信息。但是,在确定该值时,必须对其进行计算,以使超过十分之一位置的任何内容都被截断,而不是四舍五入。例如: 如果该值等于10.44,则变量值应为10.4。 如果该值等于10.45,则变量值也应设置为10.4C#-位置后截断,c#,C#,我有一个双类型变量。此变量存储作为更复杂公式一部分的信息。重要的是,该变量只能包含多达十分之一位置或一个小数点位置(即10.1、100.2等)的信息。但是,在确定该值时,必须对其进行计算,以使超过十分之一位置的任何内容都被截断,而不是四舍五入。例如: 如果该值等于10.44,则变量值应为10.4。 如果该值等于10.45,则变量值也应设置为10.4 如何截断C中相对于小数点的值?System.Math.truncate(d*10)/10您必须自己完成: public static dec
如何截断C中相对于小数点的值?System.Math.truncate(d*10)/10您必须自己完成:
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)| |(小数>28))
{
抛出新ArgumentOutOfRangeException(“小数”,“小数位数必须介于0和28之间”);
}
十进制积分=数学截断(值);
小数=数值-整数;
十进制移位=(十进制)数学功率(10,小数);
分数=数学截断(移位*分数);
分数=分数/移位;
收益率(整数+分数);
}
虽然我可能会使用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);
}
使用扩展方法:
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);
一般来说,如果您使用的是精确的十进制表示法很重要的数字,则应使用-not
double
使用十进制
,您可以执行以下操作
decimal d = ...;
d = decimal.Truncate(d*10)/10;
如果使用
double
值,则截断的数字通常无法精确表示-最终可能会出现多余的数字或较小的舍入错误。例如Math.Truncate((4.1-4.0)*10)
不是1,而是0。这是舍入,不是截断这将截断为2位。我相信它必须是静态类中的静态方法,才能成为扩展方法当然,你是对的。我添加了static关键字。我省略了类声明,因为这很明显。