C#float.ToString舍入值

时间:2014-09-30 11:16:58

标签: c# string floating-point

也许我错过了一些东西,但是float.ToString()方法对数字进行了舍入,这让我很头疼。

看看下面的小代码: 输入12345678作为输入时,调试器中的浮点数是正确的,但ToString方法的输出是12345680(我试过的任何格式......)

Console.WriteLine("Please enter a float number");
float theFloat = float.Parse(Console.ReadLine());
Console.WriteLine(string.Format("You have entered {0}", theFloat.ToString("F")));

输出:

Please enter a float number
12345678
You have entered 12345680.00

非常感谢帮助!

1 个答案:

答案 0 :(得分:10)

From the documentation for float

  • 浮点范围为-3.4×10 ^ 38至+3.4×10 ^ 38
  • 浮点数的精度为7位数。

您的号码12345678长度超过8位数,因此默认情况下 被舍入为7位有效数字,产生12345680。 (请注意默认。)

然而,尽管微软的文章中提到了浮点数的精确度,但实际上它可以保持9位精度。

Microsoft documentation for Single.ToString()州:

  

默认情况下,返回值仅包含7位精度,但内部最多保留9位数。

然后继续说:

  

如果您需要更高的精度,请指定格式为“G9”格式规范(始终返回9位精度)或“R”,如果数字可以用该精度表示,则返回7位数,如果是,则返回9位数数字只能以最大精度表示。

有了这些信息,我们可以写下这段代码:

Console.WriteLine(12345678f.ToString("G9"));

确实打印12345678

我无法解释的是为什么微软声称浮点数有7位精度,然后让我们使用9位数...

但是,请注意,并非所有8(或9)个十进制数字整数都在float中具有精确表示,如下面的代码所示(最后一位数字不同):

Console.WriteLine(16777217f.ToString("R")); // Prints 16777216