为什么在C#中准确表示了一些浮点数?

时间:2010-09-20 05:36:46

标签: c# floating-point

受到this question的启发,以下内容不符合我的预期:

float myFloat = 0.6;
Console.WriteLine(myFloat);
// Output: 0.6

我希望上面打印出0.600000023841857910.6的浮点表示) - 显然这里有一些机制可以使这个工作实际上它不应该(虽然正如你从链接的问题中看到的,它有时不起作用)

这种机制是什么以及它是如何运作的?

3 个答案:

答案 0 :(得分:4)

如果您查看Console.WriteLine的实施情况,您会发现最终会使用默认ToString对该值调用FormatProvider。即您看到的结果是使用此格式提供程序格式化时数字的显示方式。

虽然它没有解释结果如何产生的细节,但它确实表明Console.WriteLine在打印之前经历了值的某些格式化。

答案 1 :(得分:3)

我猜想,当将它转换为字符串时,带浮点数的WriteLine重载会进行舍入...

答案 2 :(得分:1)

0.6不能用IEEE754浮点数表示。它位于0.599999964237213134765625(0x3f199999)和0.600000083446502685546875(0x3f19999b)之间。舍入到最近模式产生0.60000002384185791015625(0x3f19999a),这是WriteLine正在打印的。

您必须使用更高精度的浮点表示(double)或限制WriteLine打印的小数位数:

float f = 0.6; Console.WriteLine("{0:N6}", f);