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

Posted

技术标签:

【中文标题】获取数字的小数部分和小数点后的位数(C#)【英文标题】:Get the decimal part of a number and the number of places after the decimal point (C#) 【发布时间】:2010-11-12 13:53:24 【问题描述】:

有没有人知道一种只获取数字小数部分的优雅方法?特别是我希望得到小数点后的确切位数,以便可以适当地格式化数字。我想知道是否可以在不使用文化特定小数分隔符进行任何类型的字符串提取的情况下执行此操作....

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

【问题讨论】:

为什么不能只使用 Double.ToString() 进行格式化?这会给你想要的结果。 请参阅下面对 Fredrik 帖子的评论....相同的答案。谢谢 【参考方案1】:

这只是为了格式化,我猜只调用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 在 cmets 中指出的那样;如果我们正在处理大量数字,在某些时候 d.ToString() 将返回一个具有科学格式的字符串(例如 "1E+16" 而不是 "10000000000000000")。克服此问题并强制打印完整数字的一种方法是使用d.ToString("0.#"),这也将导致与上面的代码示例产生的相同输出的较小数字。

【讨论】:

我现在意识到可以使用 Cstr 给出相同的结果...我道歉 IMO 这不是一个好方法,因为数字非常大,yourNumber.toString() 不会返回“1000000000000”而是“1.0E12”。如果它只是为了显示,没关系,但如果它是用于代码中的数学,请不要指望它。 是的 - 我想知道指数问题。幸运的是,就我目前的目的而言,我知道我不会有大于 200 且小数点后 6 位以上的数字......而且不涉及数学(目前......) @Clement H:在切换到指数模式之前,我需要达到 100000000000000。这可以通过调用 d.ToString("0.#") 来克服,对于较低的值,它也将返回与 d.ToString() 相同的结果(将更新我的答案;感谢您提出问题)。【参考方案2】:

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

基本上GetBits 将返回一个数组中的 4 个整数。

您可以使用比例因子(第四个整数,在屏蔽符号后)来表示小数位数,但您应该注意,它不一定是重要小数位数.特别是1和1.0的十进制表示不同(前者是1/1,后者是10/10)。

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

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

【讨论】:

【参考方案3】:

只是为了扩展关于 getbits 的观点,这个表达式从一个名为 foo 的小数中获取比例因子:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于获取数字的小数部分和小数点后的位数(C#)的主要内容,如果未能解决你的问题,请参考以下文章

Matlab怎样设置数据的有效数字使得小数点后的位数更多?

excel中以文本格式储存的数字转换成数字后,小数点后的数字消失了,数值自动四舍五入为整数?

js的小数位数

matlab 将数字转换成字符串,可不可以按小数点后的位数来保留?

C#中的decimal怎么保留两位小数

如何使用 DecimalFormat 方法更改小数点前数字的大小