C#float.ToString舍入值

Nim*_*rod 2 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")));
Run Code Online (Sandbox Code Playgroud)

并输出:

Please enter a float number
12345678
You have entered 12345680.00
Run Code Online (Sandbox Code Playgroud)

将非常感谢帮助!

Mat*_*son 11

从浮动的文档:

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

您的12345678数字长度超过8位数,因此默认情况下将其四舍五入为7位有效数字,从而产生12345680.(默认注意.)

然而,尽管微软的文章说明浮点数的精度,但实际上它可以保持9位数的精度.

状态的Microsoft文档Single.ToString():

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

然后继续说:

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

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

Console.WriteLine(12345678f.ToString("G9"));
Run Code Online (Sandbox Code Playgroud)

哪个打印确实12345678.

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

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

Console.WriteLine(16777217f.ToString("R")); // Prints 16777216
Run Code Online (Sandbox Code Playgroud)