有没有人知道一种优雅的方法来获取数字的小数部分?特别是我希望获得小数点后的确切位数,以便可以适当地格式化数字。我想知道如果没有使用文化特定的小数分隔符进行任何字符串提取,是否还有这个...
例如
98.0将格式化为98
98.20将格式化为98.2
98.2765将格式化为98.2765等。
答案 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()函数获取整数组件,然后从原始组件中减去。