调整小数精度.net

这些行在C#

decimal a = 2m; decimal b = 2.0m; decimal c = 2.00000000m; decimal d = 2.000000000000000000000000000m; Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c); Console.WriteLine(d); 

生成这个输出:

 2 2.0 2.00000000 2.000000000000000000000000000 

所以我可以看到,从文字创build一个十进制variables允许我来控制精度。

  • 我可以在不使用文字的情况下调整小数variables的精度吗?
  • 我如何从一个创buildb? 我怎样才能从c创buildb?

在.NET 1.1中引入了像这样保留尾随零,以更严格地符合ECMA CLI规范。

这里有一些关于MSDN的信息,例如这里 。

您可以如下调整精度:

  • Math.Round(或天花板,地板等)降低精度(b从c)

  • 乘以1.000 …(以你想要的小数位数)来提高精度 – 例如乘以1.0M以从a得到b。

你只是看到完全相同的数据不同的表示。 decimal的精度将被缩放为与其所需要的一样大(在合理范围内)。

System.Decimal

十进制数是一个浮点值,它由一个符号,一个数值(其中数值范围从0到9)和一个缩放因子组成,这些缩放因子指示分隔整数部分和小数部分的浮点小数点的位置的数值。

Decimal值的二进制表示由一个1位符号,一个96位整数和用于分割96位整数的比例因子组成,并指定它的哪一部分是小数部分。 缩放因子隐含地是数字10,被提升到从0到28的指数。因此,十进制值的二进制表示forms为((-296到2996 )/ 10 (0到28) ) ,-2 96 -1等于MinValue,而2 96 -1等于MaxValue。

缩放因子还保留了十进制数中的任何尾随零。 在算术或比较操作中,尾数零不会影响十进制数的值。 但是,如果应用了适当的格式string,则可以通过ToString方法显示尾随零。

怎么样Math.Round(十进制d,整数小数) ?

我发现我可以通过乘以或除以幻想来“篡改”规模。

 decimal a = 2m; decimal c = 2.00000000m; decimal PreciseOne = 1.000000000000000000000000000000m; //add maximum trailing zeros to a decimal x = a * PreciseOne; //remove all trailing zeros from c decimal y = c / PreciseOne; 

我可以制造一个足够精确的1来改变已知尺寸的比例因子。

 decimal scaleFactorBase = 1.0m; decimal scaleFactor = 1m; int scaleFactorSize = 3; for (int i = 0; i < scaleFactorSize; i++) { scaleFactor *= scaleFactorBase; } decimal z = a * scaleFactor; 

很容易将SQL Server中的decimal与.NET中的decimal混淆; 他们是完全不同的。

SQL Server decimal是一个定点数,当定义列或variables时,其精度和比例是固定的。

一个.NET decimalfloatdouble (不同之处在于, decimal精确地保留了十进制数字,而floatdouble精度保留二进制数字)。 试图控制一个.NET decimal的精度是毫无意义的,因为无论是否存在填充零,所有的计算结果都会得到相同的结果。

问题是 – 你真的需要存储在十进制精度,而不是只显示所需的精度小数。 大多数应用程序内部知道他们希望如何精确和显示精度。 例如,即使用户在帐户包中input了100的发票,仍然使用类似val.ToString(“n2”)的方式将其打印为100.00。

我如何从一个创buildb? 我怎样才能从c创buildb?

c到b是可能的。

 Console.WriteLine(Math.Round(2.00000000m, 1)) 

产生2.0

a到b是非常棘手的,因为引入精度的概念对math来说有点不相关。

我想一个可怕的黑客可能是一个往返。

 decimal b = Decimal.Parse(a.ToString("#.0")); Console.WriteLine(b); 

产生2.0

这将从小数点中删除所有的尾随零,然后你可以使用ToString()

 public static class DecimalExtensions { public static Decimal Normalize(this Decimal value) { return value / 1.000000000000000000000000000000000m; } } 

或者,如果您想要一个确切数量的尾随零(例如5),请首先Normalize(),然后乘以1.00000m。