获取数字的小数部分和小数点后的位数(C#)

获取数字的小数部分和小数点后的位数(C#),c#,decimal,numbers,C#,Decimal,Numbers,有人知道一种只获取数字小数部分的优雅方法吗?特别是我希望得到小数点后的确切位数,以便可以适当地格式化该数字。我想知道,如果不使用特定于区域性的十进制分隔符进行任何类型的字符串提取,是否还有其他方法可以做到这一点 例如 98.0将被格式化为98 98.20将被格式化为98.2 98.2765将被格式化为98.2765等。您可以从该方法中获得所有相关信息,假设您真正的意思是System.Decimal。(如果您谈论的是浮点/双精度小数格式,请澄清问题。) 基本上,GetBits将在一个数组中返回4个

有人知道一种只获取数字小数部分的优雅方法吗?特别是我希望得到小数点后的确切位数,以便可以适当地格式化该数字。我想知道,如果不使用特定于区域性的十进制分隔符进行任何类型的字符串提取,是否还有其他方法可以做到这一点

例如
98.0将被格式化为98
98.20将被格式化为98.2

98.2765将被格式化为98.2765等。

您可以从该方法中获得所有相关信息,假设您真正的意思是
System.Decimal
。(如果您谈论的是浮点/双精度小数格式,请澄清问题。)

基本上,
GetBits
将在一个数组中返回4个整数

您可以使用比例因子(屏蔽符号后的第四个整数)来指示小数位数,但您应该知道,它不一定是有效小数位数。特别是,1和1.0的十进制表示形式不同(前者为1/1,后者为10/10)

不幸的是,除非您可以使用.NET 4.0和
biginger
,否则操作96位整数将需要一些精细的算法


老实说,通过使用内置的格式设置
CultureInfo.InvariantCulture
,然后找到“.”右侧的所有内容,您将得到一个更简单的解决方案。假设您的意思是
System.Decimal
,那么您可以从该方法中获得所有相关信息。(如果您谈论的是浮点/双精度小数格式,请澄清问题。)

基本上,
GetBits
将在一个数组中返回4个整数

您可以使用比例因子(屏蔽符号后的第四个整数)来指示小数位数,但您应该知道,它不一定是有效小数位数。特别是,1和1.0的十进制表示形式不同(前者为1/1,后者为10/10)

不幸的是,除非您可以使用.NET 4.0和
biginger
,否则操作96位整数将需要一些精细的算法


老实说,你会得到一个更简单的解决方案,通过使用内置的格式和
CultureInfo.InvariantCulture
,然后找到“.”右边的所有内容,这只是为了格式化,我想只要调用
ToString
就可以了

double d = (double)5 / 4;
Console.WriteLine(d.ToString()); // prints 1.75
d = (double)7 / 2;
Console.WriteLine(d.ToString()); // prints 3.5
d = 7;
Console.WriteLine(d.ToString()); // prints 7
当然,这将根据当前的文化设置数字的格式(意味着小数点、千位分隔符等将有所不同)

更新


正如克莱门特H在评论中指出的那样;如果我们处理的是大量的数字,那么在某个时候d.ToString()将返回一个具有科学格式的字符串(例如
“1E+16”
而不是
“100000000000000”
)。克服此问题并强制打印完整数字的一种方法是使用
d.ToString(“0.#”)
,这也将导致对较低数字的输出与上面的代码示例产生的输出相同。

这只是出于格式化目的,我想只要调用
ToString
就可以了

double d = (double)5 / 4;
Console.WriteLine(d.ToString()); // prints 1.75
d = (double)7 / 2;
Console.WriteLine(d.ToString()); // prints 3.5
d = 7;
Console.WriteLine(d.ToString()); // prints 7
当然,这将根据当前的文化设置数字的格式(意味着小数点、千位分隔符等将有所不同)

更新


正如克莱门特H在评论中指出的那样;如果我们处理的是大量的数字,那么在某个时候d.ToString()将返回一个具有科学格式的字符串(例如
“1E+16”
而不是
“100000000000000”
)。克服此问题并强制打印完整数字的一种方法是使用
d.ToString(“0.#”)
,这也将导致对较低数字的输出与上面的代码示例产生的输出相同。

您可以使用Int()函数获得完整的数字分量,然后从原始值中减去。

您可以使用Int()函数函数获取整数分量,然后从原始值中减去。

仅扩展关于getbits的点,此表达式从一个称为foo的十进制数中获取比例因子:

(decimal.GetBits(foo)[3] & 16711680)>>16

为了扩展关于getbits的内容,此表达式从一个名为foo的十进制中获取比例因子:

(decimal.GetBits(foo)[3] & 16711680)>>16

为什么不能使用Double.ToString()进行格式化?这会给你你想要的结果。见下面弗雷德里克帖子的评论…相同的答案。谢谢为什么不能使用Double.ToString()进行格式设置?这会给你你想要的结果。见下面弗雷德里克帖子的评论…相同的答案。谢谢,我现在意识到使用Cstr可以得到相同的结果…我很抱歉这不是一个好方法,因为对于非常高的数字,yourNumber.toString()将不会返回“10000000000”,而是返回“1.0E12”。如果只是为了显示,那没关系,但是如果是为了代码中的数学,那就别指望了。是的,我想知道指数问题。幸运的是,就我目前的目的而言,我知道我不会有大于200的数字,小数点后6位以上……而且(目前)也不涉及数学。@Clement H:在它切换到指数模式之前,我需要增加到1000000000000。这可以通过调用d.ToString(“0.#”)来解决,对于较低的值,它也将返回与d.ToString()相同的结果(将更新我的答案;感谢提出这个问题)。我现在意识到,使用Cstr可以得到相同的结果…我很抱歉,这不是一个好的方法,因为对于非常高的数字,yourNumber.ToString()将不会返回“10000000000”但“1.0E12”。如果它只是用于显示,也可以,但如果它是用于代码中的数学,则不要指望它。是的-我想知道指数问题。幸运的是,就我目前的用途而言,我知道我不会有大于200且小数点超过6位的数字。。。