c# - ToString ("F") 相对于 ToString ("G") 是否失去精度?

标签 c# .net numbers format tostring

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

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

float value = 50.8836975;

编辑 抱歉,(已删除的)代码“样本”没有帮助。基本上,当我在“值”(C# float )后设置断点时,我的问题是试图解释下面调试语句的结果,该断点已分配给计算结果。 Jon Skeet的答案正是我所需要的(他的第一行让我去寻找那些无用的代码)。

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

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

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

最佳答案

你的问题不清楚,因为你给出了一个没有 f 后缀的真实值,并试图将它分配给一个 float 变量。如果您实际使用的是 float 变量,则准确 值为

50.883697509765625

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

50.8836974999999966939867590554058551788330078125

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

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

By default, a Single value contains only 7 decimal digits of precision, although a maximum of 9 digits is maintained internally.

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

关于c# - ToString ("F") 相对于 ToString ("G") 是否失去精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9570796/

相关文章:

c# - 使用继承

c# - 您如何检测文件何时被放入 Windows 资源管理器?

c# - 将整数转换为字节数组

.net - 我如何生成这个特定的数字序列?

c# - 从 Sense 查询转移到 Visual Studio 查询

c# - C#中不同类型的通用列表

c# - Moq - 模拟泛型方法的正确设置

c# - 如何在数据网格行标题中添加分组行的所有列值

c# - 为什么 Microsoft 建议跳过为引用类型实现相等运算符?

java - 总和为 N 且逆数总和为 1 的所有自然数