这些行在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从一个?我怎么可以创建b从c?
有帮助吗?

解决方案

保留尾随零这样的介绍。净1.1为更严格的一致性与通信机制详解CLI规范。

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

你可以调整的精确度如下:

  • 数学。圆(或天花板、地板等),以减少精确度(b从c)

  • 再乘以1000块...(用的小数位数你想要的),以提高精确度-例如乘通过1.0米,获得b中的一个。

其他提示

你只是看到不同的陈述完全相同的数据。精密的 decimal 将扩展到可以大,因为它需要(在合理的范围内).

System.Decimal:

一个小数是一个浮点 值,包括一个标志、一个 数值在每个数字在 值范围从0到9, 一个 伸缩因素是指示 位置浮动小数点 分隔的整体, 小数部分的数值。

二进制代表的一个小数 值由1位标志, 96位整数和比例 因数用于分96位 整和指定的哪些部分它 是一个小数部分。缩放 的因素是隐含的10号, 提高到一个指数范围从0 到28个。因此,二进制 表示小数值 的形式((-296 296) / 10(0到 28)),其中-296-1等于 MinValue,296-1等于 MaxValue.

缩放因子也保留了任何 尾随零,在一个小数。尾随零做不会影响 值的一个小数在 运算或比较行动。然而,尾随零可以 由ToString方法显示,如果一个 适当的格式串的应用。

我发现我可以"篡改"的规模乘以或除以通过一个花式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;

它是很诱人混淆 decimal 在SQL服务器 decimal 中。网;他们有很大的不同。

SQL服务器 decimal 是一个固定点数的精确度和规模都是固定的时列或可变定义。

A.净 decimal 是一个浮点数喜欢 floatdouble (不同的是, decimal 准确地保留了十进制数字,而 floatdouble 准确地保持二位数字)。试图控制的精确度。净 decimal 是毫无意义的,因为所有的计算将产生相同的结果,不论有或没有填补零。

问题是-你真的需要精密的 储存 在小数,而不仅仅是显示小数点所需的精度。大多数应用中知道国内如何精确的他们想要和显示水平的精确度。例如,即使用户进入的发票100在一个帐户包装,但它仍然打印出如100.00使用类似val。ToString("n2").

我怎么可以创建b从一个?我怎么可以创建b从c?

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

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

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

或者,如果你想要一个确切数量的尾随零,说5,首先恢复正常()然后乘以1.00000m。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top