ToString("F")相对于ToString("G")会丢失精度吗?

Nic*_*ick 1 .net c# format numbers tostring

我使用.Net 3.5在C#中编程,试图控制浮点数作为字符串输出的格式.

但是,我看到了一些意想不到的行为.如果我的代码包含(例如):

浮点值= 50.8836975;

编辑 对不起,那个(删除的)代码"示例"没有用.基本上,我的问题是当我在"值"之后设置一个断点 - 一个C#浮点数 - 被分配了计算结果时,我试图解释下面的调试语句的结果.Jon Skeet的回答正是我所需要的(他的第一行让我为无用的代码执行任务).

然后,当我在立即窗口中尝试各种选项时,我看到以下结果:

?value
50.8836975
?value.ToString("G9")
"50.8836975"
?value.ToString("F9")
"50.883700000"
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么我的F9格式的值似乎已失去3位数的精度?

Jon*_*eet 8

您的问题不清楚,因为您已经给出了没有f后缀的实际值,并尝试将其分配给float变量.如果您实际使用的是float变量,那么确切的值是

50.883697509765625
Run Code Online (Sandbox Code Playgroud)

如果您实际使用的是double变量,则确切的值为:

50.8836974999999966939867590554058551788330078125
Run Code Online (Sandbox Code Playgroud)

如果您使用a float,我会得到与F9相同的结果,但如果您使用的话,则不会double.

System.Single(float)的文档揭示了精度降低的原因:

默认情况下,Single值仅包含7个十进制数字的精度,但内部最多保留9位数.

我相信F正确显示精确度的所有真实数字,试图阻止你相信你实际上获得的信息比你拥有的更多.