这里有一个类似的问题。有时该解决方案会出现异常,因为数字可能很大。
我认为,如果有一种方法可以查看十进制数的字节,那么效率会更高。例如,十进制数必须由一些 n 个字节表示。例如,一个 Int32 由 32 位表示,所有以 1 位开头的数字都是负数。也许与十进制数有某种类似的关系。你怎么能看十进制数的字节?还是整数的字节?
如果您真的在谈论十进制数(而不是浮点数),那么Decimal.GetBits将让您查看小数的各个位。MSDN 页面还包含对位含义的描述。
另一方面,如果你只是想检查一个数字是否有小数部分,做一个简单的
var hasFractionalPart = (myValue - Math.Round(myValue) != 0)
比解码二进制结构容易得多。这应该适用于小数以及经典的浮点数据类型,例如float或double。在后一种情况下,由于浮点舍入误差,检查Math.Abs(myValue - Math.Round(myValue)) < someThreshold
而不是比较可能是有意义的0
。
如果您想要一种合理有效的方法来获取decimal
类型的“十进制”值,您可以将其修改为一个。
decimal number = 4.75M;
decimal fractionalPart = number % 1;
Console.WriteLine(fractionalPart); //will print 0.75
虽然它可能不是理论上的最佳解决方案,但它会非常快,并且几乎可以肯定对于您的目的来说足够快(比字符串操作和解析要好得多,这是一种常见的幼稚方法)。
您可以使用Decimal.GetBits
为了从十进制结构中检索位。
上面链接的 MSDN 页面详细说明了它们在内存中的布局方式:
Decimal 数的二进制表示由一个 1 位符号、一个 96 位整数和一个比例因子组成,该比例因子用于划分整数并指定它的哪一部分是小数部分。比例因子隐含地是数字 10,升为从 0 到 28 的指数。
返回值是一个 32 位有符号整数的四元素数组。
返回数组的第一个、第二个和第三个元素包含 96 位整数的低、中和高 32 位。
返回数组的第四个元素包含比例因子和符号。它由以下部分组成:
位 0 到 15(低位字)未使用且必须为零。
位 16 到 23 必须包含 0 到 28 之间的指数,表示整数除以 10 的幂。
位 24 到 30 未使用,必须为零。
第 31 位包含符号;0 表示积极,1 表示消极。
与 Oded 的详细信息一起使用 GetBits,我想出了这个
const int EXP_MASK = 0x00FF0000;
bool hasDecimal = (Decimal.GetBits(value)[3] & EXP_MASK) != 0x0;