C# 十进制数字截断C

C# 十进制数字截断C,c#,C#,我有一个具有以下值的十进制变量 a = 99.9999 b = 88.423766 c = 11.896589 这里我尝试用4个小数点进行转换 我曾经 a = Math.Round(Convert.ToDecimal(a), 4); b = Math.Round(Convert.ToDecimal(b), 4); c = Math.Round(Convert.ToDecimal(c), 4); 但是我得到的值是 a = 100 b = 88.4238 c = 11.8966 虽然首选值没有

我有一个具有以下值的十进制变量

a = 99.9999
b = 88.423766
c = 11.896589
这里我尝试用4个小数点进行转换

我曾经

a = Math.Round(Convert.ToDecimal(a), 4);
b = Math.Round(Convert.ToDecimal(b), 4);
c = Math.Round(Convert.ToDecimal(c), 4);
但是我得到的值是

a = 100
b = 88.4238
c = 11.8966
虽然首选值没有四舍五入

a = 99.9999
b = 88.4237
c = 11.8965

我怎样才能做到这一点

这将保留4个小数并截断其余的小数:

a = decimal.Truncate(a*10000)/10000;
b = decimal.Truncate(b*10000)/10000;
c = decimal.Truncate(c*10000)/10000;

没有内置函数将一个小数点截断为N个小数点,但它非常简单:

a = Math.Truncate(a * 10000m) / 10000m;
或作为辅助函数:

public decimal Truncate(decimal d, int n)
{
    // calculate 10^n
    decimal t = (decimal)Math.Pow(10.0,n);

    return Math.Truncate(d * t) / t;
}
或作为扩展方法:

public decimal Truncate(this decimal d, int n)
{
    // calculate 10^n
    decimal t = (decimal)Math.Pow(10.0,n);

    return Math.Truncate(d * t) / t;
}

请注意,Math.Truncate和Math.Floor之间的区别在于处理负数。Math.Truncate逐字截断十进制数字,而Math.Floor返回的最大整数小于输入值,因此Math.Truncate-1.2将返回-1,而Math.Floor-1.2将返回-2。

@marsh该问题需要舍入,这一个需要截断。Convert.ToDecimal没有重载,它有两个参数,第二个参数是int-您可能是指Convert.ToDecimalMath.Round。。。你能纠正你的问题吗,这样代码就是你正在使用的吗?不会的。用-88.423766m试试,结果是-88.4238没有被截断。哎呀,计算中漏了一个零。负值是个问题…谢谢,这是一个很好的解释。