【问题标题】:Does ToString("F") lose precision relative to ToString("G")?ToString("F") 相对于 ToString("G") 是否会丢失精度?
【发布时间】:2012-03-05 17:05:07
【问题描述】:

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

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

浮点值 = 50.8836975;

编辑抱歉,(已删除)代码“示例”没有帮助。基本上,当我在“值”(一个 C# 浮点数)被分配计算结果之后设置断点时,我的问题是试图解释下面的调试语句的结果。 Jon Skeet 的回答正是我所需要的(他的第一行带我去处理无用的代码)。

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

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

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

【问题讨论】:

  • 50.8836975.ToString("F9") -> 50.883697500 对我来说(注意该值是double,而不是float)。
  • 您的代码一开始就无法编译 - 您已经给出了 double 文字并试图将其分配给 float 变量。是哪个?
  • 好的,我会坦白的。我的代码实际上并不包含该行值 = 50.8836975。然而,当我到达断点时,那是我的调试器中显示的那个浮点(是的,真的!)变量的值。所以我不得不把那个推迟到 Visual Studio。

标签: c# .net numbers format tostring


【解决方案1】:

您的问题不清楚,因为您给出了一个没有f 后缀的实值,并试图将其分配给float 变量。如果您实际上使用的是 float 变量,那么 exact 值是

50.883697509765625

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

50.8836974999999966939867590554058551788330078125

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

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

默认情况下,Single 值仅包含 7 位精度的十进制数字,尽管内部维护最多 9 位数字。

我相信F 正确地显示了所有实数位的精度,以防止你相信你实际上得到的信息比你所拥有的更多。

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2023-02-10
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多