繁体   English   中英

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

[英]Why are some floating point numbers accurately represented in C#?

受到这个问题的启发,以下内容并没有达到我的预期:

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

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

这个机制是什么?它是如何工作的?

如果你看一下Console.WriteLine的实现,你会看到它最终使用默认的FormatProvider调用ToString 即您看到的结果是使用此格式提供程序格式化时数字的显示方式。

虽然它没有解释结果如何产生的细节,但它确实显示Console.WriteLine在打印之前会对值进行一些格式化。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM