截断C#的十进制数字

本文关键字:十进制数字 截断 | 更新日期: 2023-09-27 18:29:49

我有一个十进制变量,其值如下

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

我该如何实现。

截断C#的十进制数字

没有将decimal截断到小数点后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.TruncateMath.Floor之间的区别在于负数的处理。Math.Truncate从字面上截断十进制数字,而Math.Floor返回小于输入的最高整数,因此Math.Truncate(-1.2)将返回-1,而Math.Floor(-1.2)将返回-2

这将保留4位小数并截断其余部分:

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