我有一个浮点值:12345.6489
当我使用以下格式格式化时:
(12345.6489f).ToString("F1")
然后我得到一个结果
12345.7
但这是不正确的,因为它应该是 12345.6。
有谁明白为什么会发生这种情况?另一个提示是,在我格式化返回正确结果之前强制转换为 double,如果我的浮点值小一点,例如 1234.6489,那么我也会得到正确的结果。
我有一个浮点值:12345.6489
当我使用以下格式格式化时:
(12345.6489f).ToString("F1")
然后我得到一个结果
12345.7
但这是不正确的,因为它应该是 12345.6。
有谁明白为什么会发生这种情况?另一个提示是,在我格式化返回正确结果之前强制转换为 double,如果我的浮点值小一点,例如 1234.6489,那么我也会得到正确的结果。
这似乎与我前段时间问的一个问题有关:Round-twice error in .NET's Double.ToString method
请注意,如果您拨打.ToString("G")
您的号码,它会正确四舍五入为12345.65
。如果将四舍五入的数字四舍五入到小数点后一位,就会出现问题。
当我早些时候调查我自己的问题时,我还发现了一些无法解释为循环两次错误的示例,因此也请检查该线程。
加法:请注意,任何可以(精确)由 a 表示的数字,也可以由 afloat
表示(有很多零位)double
。可以使用以下技巧(问题也提到了):
float x = 12345.6489f;
string trick = ((double)x).ToString("F1");
谢谢这个问题!从事调查是非常有趣的课题。但我想说的是另一方的奖牌。你问了以下问题:
(12345.6489f).ToString("F1")
然后我得到一个结果
12345.7
但这是不正确的,因为它应该是 12345.6。
好吧,我想知道你是如何弄清楚这个字符串格式化例程的正确输出是什么?这些格式化字符串不应该用于舍入目的。文档清楚地说明了这一点:
老实说,当我第一次从您的问题中查看数字时 - 第一个想法是关于 Hans Passant 在他的回答中提到的舍入算法。所以,我什至不会对选择这样的算法感到惊讶,它实际上非常直观:) 我什至不会惊讶他们会考虑将普通截断作为浮点数格式化的算法。它仍然非常准确和有效。
因此,尽管所有这些都非常有趣并且看起来像一个错误/悖论/奇迹,但这实际上只是我们对这个功能的错误期望,该功能旨在做(实际上做得很好)另一件事。