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

时间:2009-07-21 08:35:01

标签: c# decimal numbers

有没有人知道一种优雅的方法来获取数字的小数部分?特别是我希望获得小数点后的确切位数,以便可以适当地格式化数字。我想知道如果没有使用文化特定的小数分隔符进行任何字符串提取,是否还有这个...

例如
98.0将格式化为98
98.20将格式化为98.2
98.2765将格式化为98.2765等。

4 个答案:

答案 0 :(得分:5)

它仅用于格式化目的,只是调用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

当然,这将根据当前文化格式化数字(意味着小数符号,千位分隔符等会有所不同)。

<强>更新

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

答案 1 :(得分:4)

您可以从Decimal.GetBits方法获取所有相关信息,假设您的确是System.Decimal。 (如果你在谈论浮点数/双精度的十进制格式,请澄清问题。)

基本上GetBits会在数组中返回4个整数。

您可以使用缩放系数(屏蔽符号后的第四个整数)来指示小数位数,但您应该知道它不一定是显着小数位数。特别是,1和1.0的十进制表示是不同的(前者是1/1,后者是10/10)。

不幸的是,除非你可以使用.NET 4.0和BigInteger,否则操纵96位整数将需要一些繁琐的算术。

老实说,通过使用内置格式CultureInfo.InvariantCulture,然后找到“。”右侧的所有内容,您将获得更简单的解决方案。

答案 2 :(得分:2)

为了扩展关于getbits的观点,这个表达式从一个名为foo的小数中得到缩放因子:

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

答案 3 :(得分:0)

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