[英]Why are some floating point numbers accurately represented in C#?
受到这个问题的启发,以下内容并没有达到我的预期:
float myFloat = 0.6;
Console.WriteLine(myFloat);
// Output: 0.6
我希望上面打印出0.60000002384185791
( 0.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.