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

时间:2012-03-05 17:05:08

标签: c# .net numbers format tostring

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

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

float value = 50.8836975;

修改抱歉,该(已删除)代码“示例”无效。基本上,我的问题是当我在“值”之后设置一个断点 - 一个C#浮点数 - 被分配了计算结果时,我试图解释下面我的调试语句的结果。 Jon Skeet的回答正是我所需要的(他的第一行让我为无用的代码负责)。

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

?value
50.8836975
?value.ToString("G9")
"50.8836975"
?value.ToString("F9")
"50.883700000"

有谁可以解释为什么我的F9格式的值似乎丢失了3位精度?

1 个答案:

答案 0 :(得分:8)

您的问题不明确,因为您在没有f后缀的情况下给出了实际值,并尝试将其分配给float变量。如果您实际使用的是float变量,则完全值为

50.883697509765625

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

50.8836974999999966939867590554058551788330078125

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

System.Singlefloat)的文档显示了精度降低的原因:

  

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

我相信F正确显示精确度的所有真实数字,以防止您相信您实际获得的信息比您更多。