调整小数精度,.NET调整小数精度,.NET(Adjusting decimal precision

2019-06-14 14:27发布

这些线在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

所以,我可以看到,创建从文字小数变量可以让我来控制的精度。

  • 我可以调整小数变量的精度,而无需使用文字?
  • 我怎样才能从创建B' 我怎样才能从C创建B'

Answer 1:

像这样保持尾随零被引入在更严格的一致性.NET 1.1与ECMA CLI规范。

有一些这方面的信息在MSDN上,例如在这里 。

您可以按以下步骤调整精度:

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

  • 乘以1.000 ...(有小数的你想要的号码),以提高精确度 - 例如乘以1.0M从拿到湾



Answer 2:

你只是看到了完全相同的数据的不同表示。 一的精度decimal将被调整,因为它需要为(合理范围内)应象大。

System.Decimal

十进制数是一个浮点值,它由一个符号,数字值,其中在所述值的每个数字范围从0到9的,以及指示浮动小数点的,所述整数和小数部分分离出来的位置的缩放因子的数值。

一个十进制值的二进制表示由一个1位的标志,96位整数,用来划分的96位整数,指定哪些它部分是小数的缩放因子的。 缩放因子是隐式地数目为10,升温至指数取值范围为0至28.因此,十进制值的二进制表示的形式为,((-2 96到2 96)/ 10(0〜28))其中-2 96 -1等于MINVALUE,和2 96 -1等于MaxValue的。

缩放系数也保持在一个十进制数任何尾随零。 尾随零不影响算术或比较运算的十进制数的值。 然而,尾随零可以通过ToString方法,如果施加适当的格式字符串显示。



Answer 3:

关于什么Math.Round(十进制d,诠释小数) ?



Answer 4:

我发现我可以乘以或看中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;

我可以制造一个足够精确的1通过公知的尺寸来改变缩放因子。

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

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

decimal z = a * scaleFactor;


Answer 5:

人们很容易混淆decimal在与SQL Server decimal在.NET; 他们有很大的不同。

一个SQL Server decimal是定点数,其精度和标度被定义的列或变量时是固定的。

甲.NET decimal像一个浮点数floatdouble (不同之处在于decimal准确保留十进制数字,而floatdouble准确保存二进制数)。 试图控制一个.NET的精度decimal是没有意义的,因为所有的计算将产生相同的结果而不管填充的零的存在或不存在的。



Answer 6:

现在的问题是-你真的需要存储在小数精度,而不是仅仅显示小数的精度要求。 大多数应用程序内部知道自己要如何准确是和显示,以精确该水平。 例如,即使如果用户输入用于在帐户封装100的发票,它仍然打印出作为100.00使用类似val.ToString(“N 2”)。

我怎样才能从创建B' 我怎样才能从C创建B'

C到B是可能的。

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

产生2.0

a与b是棘手,因为引入精度的概念是一个小外星人数学。

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

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

产生2.0



Answer 7:

这将删除从十进制所有尾部零,然后你可以使用ToString()

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

或者另外,如果你想尾随零的一个确切的数字,说5,第一规格化(),然后乘以1.00000米。



文章来源: Adjusting decimal precision, .net