代码之家  ›  专栏  ›  技术社区  ›  Amy B

调整小数精度.NET

  •  61
  • Amy B  · 技术社区  · 15 年前

    这些线条用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
    

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

    • 我可以在不使用文本的情况下调整十进制变量的精度吗?
    • 如何从a创建b?如何从C创建B?
    7 回复  |  直到 12 年前
        1
  •  48
  •   to StackOverflow    15 年前

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

    在msdn上有一些关于这个的信息,例如 here .

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

    • 数学。圆形(或天花板、地板等)以降低精度(B从C)

    • 乘以1.000…(使用所需的小数位数)提高精度-例如,乘以1.0米从A中得到B。

        2
  •  18
  •   Roman Starkov    13 年前

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

    System.Decimal :

    小数是一个浮点 由符号组成的值,a 数字值,其中 值的范围为0到9,以及 一 表示 浮点小数点的位置 把积分和 数值的小数部分。

    十进制的二进制表示法 值由一个1位符号、一个 96位整数和缩放比例 用于分割96位的因子 整数并指定它的哪一部分 是小数。结垢 系数隐式为数字10, 提升为0范围内的指数 到28。因此,二进制 十进制值的表示是 形式,(-2 九十六 到2 九十六 )/ 10 (0至) 28) ,其中-2 九十六 - 1等于 MimValand和2 九十六 - 1等于 最大值。

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

        3
  •  6
  •   Tadas Å ukys    15 年前
        4
  •  5
  •   Amy B    15 年前

    我发现我可以通过乘以或除以一个花哨的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;
    
        5
  •  5
  •   Christian Hayter    15 年前

    很容易混淆 decimal 在SQL Server中 十进制的 在.NET中,它们是完全不同的。

    SQL服务器 十进制的 定义列或变量时,其精度和小数位数是固定的。

    A.NET 十进制的 是一个浮点数吗? float double (区别在于 十进制的 准确保留小数位数,而 浮动 双重的 精确地保留二进制数字)。试图控制.NET的精度 十进制的 是无意义的,因为无论是否有填充零,所有的计算都将产生相同的结果。

        6
  •  1
  •   sgmoore    15 年前

    问题是-你真的需要精确吗? 存储 以十进制表示,而不仅仅是按要求的精度显示十进制。 大多数应用程序在内部都知道它们希望达到多高的精度,并显示到该精度水平。例如,即使用户在帐户包中输入100的发票,它仍然使用val.tostring(“n2”)之类的东西打印出100.00。

    如何从a创建b?如何从C创建B?

    C到B是可能的。

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

    生产2

    A到B很难理解,因为引入精度的概念与数学有点不一样。

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

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

    生产2

        7
  •  1
  •   shamp00    12 年前

    这将从小数中删除所有尾随的零,然后您只需使用 ToString() .

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

    或者,如果您想要一个精确的尾随零数,比如5,首先是normalize(),然后乘以1.00000m。