为什么使用decimal(int [])构造函数?

Mak*_*ebi 28 .net c# refactoring decimal

我保持了C#桌面应用程序,在Windows 7上,使用Visual Studio 2013和某处有以下行,试图创建一个0.01十进制值的代码,使用十进制(的Int32 [])构造函数:

decimal d = new decimal(new int[] { 1, 0, 0, 131072 });
Run Code Online (Sandbox Code Playgroud)

第一个问题是,它与以下不同吗?

decimal d = 0.01M;
Run Code Online (Sandbox Code Playgroud)

如果没有什么不同,开发人员为什么会遇到这样编码的麻烦?

我需要更改此行以创建动态值.就像是:

decimal d = (decimal) (1 / Math.Pow(10, digitNumber));
Run Code Online (Sandbox Code Playgroud)

我会以这种方式引起一些不受欢迎的行为吗?

Pat*_*man 12

当小数点的来源由位组成时,对我来说似乎很有用.

.NET中使用的十进制有一个基于一系列位参数的实现(不只是一个位流,比如一个int),所以当你与其他系统进行通信时,使用位来构造一个小数位是很有用的.十进制通过一个字节blob(一个套接字,一块内存等).

现在很容易将位组转换为小数.无需花哨的转换代码.此外,您可以根据标准中定义的输入构造小数,这样便于测试.NET框架.

  • 似乎很可能,特别是因为没有`BitConverter.ToDecimal()`等等.我假设`Decimal.GetBits()`是这个难题的另一部分. (3认同)

Has*_*niH 8

decimal(int[] bits)构造函数允许你给你创建位必须是一个4 int数组,其中小数的按位定义:

位0,1和2构成96位整数.

位3包含比例因子和符号

它只是让你从你的例子中得到十分精确的十进制定义,我认为你不需要那么高的精度.

有关使用该构造函数的更多详细信息,请参阅此处,或者此处查看可能更适合您的其他构造函数

更具体地回答你的问题,如果digitNumber是16位指数然后decimal d = new decimal(new int[] { 1, 0, 0, digitNumber << 16 });做你想要的,因为指数进入数组中最后一个int的16 - 23位

  • "位0,1和2组成了96位整数"我认为这是一个非常令人困惑的公式,因为它听起来像你组合3位并得到96位.(.Net的作者没有通过命名参数`bits`来帮助你.) (3认同)