C# 为什么使用“G”标准格式字符串格式化Double不会返回完整字符串?
我希望我已经对此进行了足够的研究,这样我的前提就不会完全偏离基准。如果是这样的话,那么那里的数学家们可以让我明白 我的前提是,双精度值(如12.5)应四舍五入到5位有效数字,而不是小数点后12.500位。相反,使用以下C代码,我得到了12.5: 我遇到了2007年的问题,这似乎与我的问题相呼应。事实上,我使用这些示例数字只是为了保持一致 我的目标是更好地理解以下内容: 我对sig figs的理解在数学上正确吗?也就是说,我的预期是否合理,或者输出12.5是否正确 这真的是框架中一个非常长期存在的bug吗?如果是的话,它能/会被修复吗 假设它是一个bug,我现在该怎么办呢?写一个hack来确定有多少 你真的回来了,然后把它垫起来?将我自己的代码滚动到 做G格式字符串应该做的事情?我已经遇到过这样的例子,所以这可能就是不存在清洁选项的证据 此外,我确实意识到Double的存储问题可能会对这个问题的舍入方面产生负面影响,但现在,我只关心sig fig多于原始数字的问题 编辑:我已经在Framework4.5中测试过了。请参阅上的此链接。它明确指出: 如果需要,结果包含一个小数点,小数点后的尾随零将被忽略 请参阅上的此链接。它明确指出: 如果需要,结果包含一个小数点,小数点后的尾随零将被忽略 双精度值四舍五入为15位有效数字,而不是5位有效数字 参考: 将一个数字四舍五入到任意数量的有效数字并不意味着格式化字符串必须包含该数量的数字。如果该值四舍五入为12.5000000000000,则将其格式化为12.5,因为这是表示该值的最简洁的方式。双精度值四舍五入为15位有效数字,而不是5位有效数字 参考:C# 为什么使用“G”标准格式字符串格式化Double不会返回完整字符串?,c#,string-formatting,significant-digits,C#,String Formatting,Significant Digits,我希望我已经对此进行了足够的研究,这样我的前提就不会完全偏离基准。如果是这样的话,那么那里的数学家们可以让我明白 我的前提是,双精度值(如12.5)应四舍五入到5位有效数字,而不是小数点后12.500位。相反,使用以下C代码,我得到了12.5: 我遇到了2007年的问题,这似乎与我的问题相呼应。事实上,我使用这些示例数字只是为了保持一致 我的目标是更好地理解以下内容: 我对sig figs的理解在数学上正确吗?也就是说,我的预期是否合理,或者输出12.5是否正确 这真的是框架中一个非常长期存在的
将一个数字四舍五入到任意数量的有效数字并不意味着格式化字符串必须包含该数量的数字。如果该值四舍五入为12.5000000000000,则将其格式化为12.5,因为这是表示该值的最简洁的方式。12.5的值只有3个有效数字。精度指定输出中的最大位数,而不是确切的位数。我注意到我是在你提到的帖子上回复的,与这里的想法基本相同…@JonSkeet,它说的是最大值。我一开始读起来就没想到。尽管如此,我还是对Ben Voigt的回答感到担忧,他认为12.500在数学上是更准确的回报,因为这对读者来说意味着更高的精度。那不是真的吗?我试图传达的正是这种准确性的暗示。虽然我明白你的观点,但老实说,我认为里克引用的文档是最有说服力的。如果您对包括尾随零在内的特定数量的有效数字感兴趣,那么您可能需要查看十进制。12.5的值只有3个有效数字。精度指定输出中的最大位数,而不是确切的位数。我注意到我是在你提到的帖子上回复的,与这里的想法基本相同…@JonSkeet,它说的是最大值。我一开始读起来就没想到。尽管如此,我还是对Ben Voigt的回答感到担忧,他认为12.500在数学上是更准确的回报,因为这对读者来说意味着更高的精度。那不是真的吗?我试图传达的正是这种准确性的暗示。虽然我明白你的观点,但老实说,我认为里克引用的文档是最有说服力的。如果你对特定数量的有效数字感兴趣,包括尾随的零,那么你可能想看看十进制。我确实理解四舍五入和有效数字之间的区别。我建议12.500比12.5更准确地传达给读者。我对sig-figs定义的记忆与此相关。现在,C格式字符串可能无法很好地播放…@DonBoitnott:Double数据类型不跟踪值的预测,因此为了显示完整精度,它将始终格式化为15位有效数字。如果将12.500赋值给变量,它的格式仍将设置为12.5000000000000,因为这是数据类型可以处理的精度,即使输入没有那么精确。我确实理解舍入和有效数字之间的差异。我建议12.500比12.5更准确地传达给读者。我对sig-figs定义的记忆与此相关。 现在,C格式字符串可能无法很好地播放…@DonBoitnott:Double数据类型不跟踪值的预测,因此为了显示完整精度,它将始终格式化为15位有效数字。如果将12.500赋值给变量,它的格式仍将设置为12.5000000000000,因为这是数据类型可以处理的精度,即使输入没有那么精确。
Double d = 12.5;
Console.WriteLine(d.ToString("G5"));