Decimal digit truncating C# C# 中的小数位截断

7 浏览
0 Comments

Decimal digit truncating C# C# 中的小数位截断

我有一个包含以下数值的小数变量:

a = 99.9999
b = 88.423766
c = 11.896589

我想要将它们转换为四位小数。

我使用了以下代码:

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

我该如何实现这个需求?

0
0 Comments

在C#中,没有内置的函数可以将一个decimal类型的数字截断为N位小数,但是有几种简单直接的方法可以实现:

第一种方法是使用Math.Truncate函数:

a = Math.Truncate(a * 10000m) / 10000m;

第二种方法是创建一个辅助函数:

public decimal Truncate(decimal d, int n)

{

// 计算10^n

decimal t = (decimal)Math.Pow(10.0,n);

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

}

第三种方法是创建一个扩展方法:

public decimal Truncate(this decimal d, int n)

{

// 计算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。

这些方法可以很方便地在C#中将一个decimal类型的数字截断为指定位数的小数。

0
0 Comments

问题出现的原因:

在给定的代码中,首先将变量a、b和c乘以10000,然后使用decimal.Truncate函数将结果截断为整数,再除以10000。这样做的目的是保留小数点后4位,并截断其余位数。然而,在处理负数时出现了问题。

解决方法:

为了解决这个问题,需要在乘以10000之前先将变量a、b和c的值转换为正数。这样可以确保截断后的结果是正确的。

修改后的代码如下:

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

这样修改后,即使处理负数,也能正确地截断小数位数。

0