here中有类似的问题。有时,该解决方案会提供例外,因为数字可能会很大。
我认为如果有办法查看十进制数字的字节,它会更有效率。例如,十进制数必须由n个字节表示。例如,Int32由32位表示,所有以1位开头的数字都是负数。也许与十进制数有某种类似的关系。你怎么看十进制数的字节?或整数的字节?
答案 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;