通过查看字节来检查十进制是否包含小数位

时间:2012-04-17 19:20:56

标签: c# decimal

here中有类似的问题。有时,该解决方案会提供例外,因为数字可能会很大。

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

4 个答案:

答案 0 :(得分:11)

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

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

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

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

答案 1 :(得分:4)

如果你想要一种合理有效的方法来获得decimal类型的'十进制'值,你可以将其修改为一。

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

虽然它可能不是理论上的最佳解决方案,但它会非常快,并且几乎肯定足够快以达到您的目的(远远优于字符串操作和解析,这是一种常见的天真方法)。

答案 2 :(得分:2)

您可以使用Decimal.GetBits从小数结构中检索位。

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

  

十进制数的二进制表示由1位符号,96位整数和用于除以整数的比例因子组成,并指定它的哪个部分是小数。缩放因子隐式为数字10,上升到0到28之间的指数。

     

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

     

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

     

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

     

0到15位,低位字未使用,必须为零。

     

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

     

第24至30位未使用且必须为零。

     

位31包含符号; 0表示正面,1表示负面。

答案 3 :(得分:1)

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

const int EXP_MASK = 0x00FF0000;
bool hasDecimal = (Decimal.GetBits(value)[3] & EXP_MASK) != 0x0;