C# 数字格式打印所有有效数字和分隔符

Posted

技术标签:

【中文标题】C# 数字格式打印所有有效数字和分隔符【英文标题】:C# Number Format Printing All Significant Digits and Separators 【发布时间】:2015-03-03 14:16:02 【问题描述】:

我觉得问这个有点愚蠢...我需要格式化一个数字以显示千位分隔符、小数点以及显示所有有效数字所需的精确度。 我有一个可行的解决方案,但觉得必须有更好的方法:

double myNumber = 1234.56789;
myNumber.ToString("#,##0.#########################################################################################################################"); // see my problem with this?
// will yield "1,234.56789"

我从头到尾搜索了两个互联网,但找不到我的问题的答案。像remove trailing zeros 和C# String.format a number with dynamic number of significant digits 这样的答案不遵守千位分隔符要求。而且Standard Numeric Format Strings和Custom Numeric Format Strings的两篇msdn文章都被我翻了又翻,没有带来突破。

我的注意力被带到了c# how to String.Format decimal with unlimited decimal places?,但不幸的是,没有找到更简洁的格式字符串。

一个理智而熟练的开发人员会使用什么格式的字符串?

【问题讨论】:

这有帮助吗:samples.pdmlab.com/stringformatting? @JensHorstmann - 这在英语中可能更有用(因为这里的大多数访问者和这个网站都是说英语的) @Jamiec 同意了。还没认出它是德国人:| @JensHorstmann:实际上我会说德语。我查看了页面。但是那里的表格并没有提供比我链接的两篇 msdn 文章中显示的更多或更深入的见解。 @Richard:谢谢你的链接,检查了。我明确要求一种无需#,#.###########################################的解决方案 【参考方案1】:

老实说,我看不出你的格式化字符串有什么大问题,只要你不要到处重复它(把它放在一个充满常量的类中,然后重用)。

最接近的标准格式字符串可能沿着N50 的行,但这将显示指定长度的零,因此您的示例显示为

1,234.56789000000000000000000000000000000000000000000000

【讨论】:

同意这个解决方案。您可以使用 myNumber.ToString("N20");对于双精度或十进制 N30,之后双精度/十进制的精度比字符串值的外观更大。由我在调试中两个解决方案在点后仅显示 11 位,但 N20 解决方案在第 11 位后显示零... @JensHorstmann 那是因为双精度只能保持 15-16 位十进制数字。小数点左边有 4 位,右边只剩下 11。【参考方案2】:

你没有从谷歌上找到你想要的答案的原因是你的问题有问题。

双精度数不是以十进制形式存储的,它们是二进制数。所以基于十进制的“有效数字”的概念并没有真正的意义。例如,数字 0.1 不能用二进制精确表示(就像 1/3 不能用十进制精确表示一样)。

你可以像@Jamiec 建议的那样做——这可能是你想要的(虽然 N50 有点过分了,但将二进制转换为双精度只能得到大约 17 个最大有效数字)。但是,您应该知道这并不是真正写出有效数字。从根本上说,你不能把计算机计算出的所有有效数字都写成十进制,因为它是以二进制计算的。计算机在写出之前必须先将其转换为十进制,这必然会导致精度损失。

【讨论】:

以上是关于C# 数字格式打印所有有效数字和分隔符的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义组和小数分隔符将数字格式化为字符串而不更改精度

打印矩阵的元素,每行换行,每行的元素用空格分隔

整个项目中所有数字的千位角分隔符

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

如何在c#中对以空格分隔的数字进行舍入?

将数字数组格式化为具有最小宽度的货币