我使用.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位精度?
答案 0 :(得分:8)
您的问题不明确,因为您在没有f
后缀的情况下给出了实际值,并尝试将其分配给float
变量。如果您实际使用的是float
变量,则完全值为
50.883697509765625
如果您实际使用的是double
变量,则确切的值为:
50.8836974999999966939867590554058551788330078125
如果使用float
,我会得到与F9 相同的结果,但如果您使用double
则不会。
System.Single
(float
)的文档显示了精度降低的原因:
默认情况下,Single值仅包含7个十进制数字的精度,但内部最多保留9位数。
我相信F
正确显示精确度的所有真实数字,以防止您相信您实际获得的信息比您更多。