5

这里有一个类似的问题。有时该解决方案会出现异常,因为数字可能很大。

我认为,如果有一种方法可以查看十进制数的字节,那么效率会更高。例如,十进制数必须由一些 n 个字节表示。例如,一个 Int32 由 32 位表示,所有以 1 位开头的数字都是负数。也许与十进制数有某种类似的关系。你怎么能看十进制数的字节?还是整数的字节?

4

4 回答 4

13

如果您真的在谈论十进制数(而不是浮点数),那么Decimal.GetBits将让您查看小数的各个位。MSDN 页面还包含对位含义的描述。

另一方面,如果你只是想检查一个数字是否有小数部分,做一个简单的

var hasFractionalPart = (myValue - Math.Round(myValue) != 0)

比解码二进制结构容易得多这应该适用于小数以及经典的浮点数据类型,例如floatdouble。在后一种情况下,由于浮点舍入误差,检查Math.Abs(myValue - Math.Round(myValue)) < someThreshold而不是比较可能是有意义的0

于 2012-04-17T19:25:01.260 回答
4

如果您想要一种合理有效的方法来获取decimal类型的“十进制”值,您可以将其修改为一个。

decimal number = 4.75M;
decimal fractionalPart = number % 1; 
Console.WriteLine(fractionalPart); //will print 0.75

虽然它可能不是理论上的最佳解决方案,但它会非常快,并且几乎可以肯定对于您的目的来说足够快(比字符串操作和解析要好得多,这是一种常见的幼稚方法)。

于 2012-04-17T19:29:55.917 回答
2

您可以使用Decimal.GetBits为了从十进制结构中检索位。

上面链接的 MSDN 页面详细说明了它们在内存中的布局方式:

Decimal 数的二进制表示由一个 1 位符号、一个 96 位整数和一个比例因子组成,该比例因子用于划分整数并指定它的哪一部分是小数部分。比例因子隐含地是数字 10,升为从 0 到 28 的指数。

返回值是一个 32 位有符号整数的四元素数组。

返回数组的第一个、第二个和第三个元素包含 96 位整数的低、中和高 32 位。

返回数组的第四个元素包含比例因子和符号。它由以下部分组成:

位 0 到 15(低位字)未使用且必须为零。

位 16 到 23 必须包含 0 到 28 之间的指数,表示整数除以 10 的幂。

位 24 到 30 未使用,必须为零。

第 31 位包含符号;0 表示积极,1 表示消极。

于 2012-04-17T19:24:50.753 回答
1

与 Oded 的详细信息一起使用 GetBits,我想出了这个

const int EXP_MASK = 0x00FF0000;
bool hasDecimal = (Decimal.GetBits(value)[3] & EXP_MASK) != 0x0;
于 2012-04-17T22:08:45.670 回答