受到this question的启发,以下内容不符合我的预期:
float myFloat = 0.6;
Console.WriteLine(myFloat);
// Output: 0.6
我希望上面打印出0.60000002384185791
(0.6
的浮点表示) - 显然这里有一些机制可以使这个工作实际上它不应该(虽然正如你从链接的问题中看到的,它有时不起作用)
这种机制是什么以及它是如何运作的?
答案 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);