调整小数精度,.net

Amy*_*y B 63 .net precision decimal

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);
Run Code Online (Sandbox Code Playgroud)

生成此输出:

2
2.0
2.00000000
2.000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

所以我可以看到从文字中创建一个十进制变量允许我控制精度.

  • 我可以在不使用文字的情况下调整十进制变量的精度吗?
  • 我如何从一个?创建b?如何从c创建b?

Joe*_*Joe 49

为了更严格地遵守ECMA CLI规范,在.NET 1.1中引入了保留这样的尾随零.

在MSDN上有一些信息,例如这里.

您可以按如下方式调整精度:

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

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

  • 同样_divide_由`1.000 ...`来降低精度. (6认同)

And*_*are 18

您只是看到完全相同数据的不同表示.a的精度decimal将缩放到需要的大小(在合理范围内).

来自System.Decimal:

十进制数是一个浮点值,由一个符号,一个数值组成,其中值中的每个数字范围从0到9,以及一个缩放系数,表示浮动小数点的位置,用于分隔积分和小数部分的数值.

Decimal值的二进制表示由1位符号,96位整数和用于划分96位整数的比例因子组成,并指定它的小数部分.缩放因子隐式为数字10,上升到指数范围从0到28.因此,十进制值的二进制表示形式为((-2 96到2 96)/ 10 (0到28)) ,其中-2 96 -1等于MinValue,2 96 -1等于MaxValue.

缩放因子还保留十进制数中的任何尾随零.尾随零不影响算术或比较运算中的十进制数的值.但是,如果应用了适当的格式字符串,则ToString方法可以显示尾随零.

  • 有关缩放因子的良好信息......现在我该如何调整它? (2认同)

Tad*_*kys 6

那么 Math.Round(十进制d,int小数)呢?

  • 对于.00值,您必须首先乘以1.00m:decimal.Round(value*1.00m,2) (4认同)

Amy*_*y B 5

我发现我可以通过乘以或除以花哨1来"篡改"刻度.

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;
Run Code Online (Sandbox Code Playgroud)

我可以制作足够精确的1来改变已知尺寸的比例因子.

decimal scaleFactorBase = 1.0m;
decimal scaleFactor = 1m;
int scaleFactorSize = 3;

for (int i = 0; i < scaleFactorSize; i++)
{
  scaleFactor *= scaleFactorBase;
}

decimal z = a * scaleFactor;
Run Code Online (Sandbox Code Playgroud)

  • 有趣,但同时令人费解.2.0m和2.00000000m之间究竟有什么区别?在非计算环境中,我认为这意味着后一个数字保证了这个精度,而前者仅保证在第一个小数点.但乘法应该意味着结果只精确到小数点后一位. (3认同)

Chr*_*ter 5

decimal在SQL Server和decimal.NET中混淆是很诱人的; 他们是完全不同的.

SQL Server decimal是一个定点数,在定义列或变量时,其精度和比例是固定的.

.NET decimal是一个像float和的浮点数double(不同之处在于decimal准确保留十进制数字,float而且double准确地保留二进制数字).试图控制.NET的精度decimal是没有意义的,因为无论是否存在填充零,所有计算都将产生相同的结果.