【问题标题】:C# float.ToString Rounding ValuesC# float.ToString 舍入值
【发布时间】:2014-09-30 23:22:14
【问题描述】:

也许我遗漏了一些东西,但 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

我们将不胜感激!

【问题讨论】:

  • @MatthewWatson 不错的评论,指向一个大约 1000 页的文档,非常有帮助^^
  • @MatthewWatson 我没有,我的意思是在没有线索的情况下将某人发送到具有该大小的文档并且不知道要查找什么通常不是很有帮助(即使他正在寻找的东西是一开始)至少你可以说明在哪里寻找......
  • @MeAndSomeRandoms 这种事情通常是为答案保留的,而不是 cmets。
  • 我很快就在文档中找到了这个宝石 - “将无限多个实数压缩成有限位数需要一个近似表示。......给定任何固定位数, 大多数实数计算将产生无法用那么多位精确表示的量。因此,浮点计算的结果必须经常四舍五入以适应其有限表示。这种舍入误差是浮点计算。”

标签: c# string floating-point


【解决方案1】:

From the documentation for float:

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

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

但是,尽管 Microsoft 文章中提到了浮点数的精度,但实际上它最多可容纳 9 位精度。

Microsoft documentation for Single.ToString() 声明:

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

它接着说:

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

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

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

确实打印了12345678

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

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

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

【讨论】:

  • 根据这个答案,浮点数的值应该已经被削减了。浮点值本身是可以的(您可以在调试器中看到它)。问题出在“ToString”方法中……
  • 另外,正如@PatrickHofman 所说,将浮点数转换为 int 并打印它就可以完成这项工作,这也证明了浮点值是完整的
  • 我不太明白浮点数(也与 IEEE 兼容)如何仅在 23 位(可以,24 位,如果您愿意)有效位中保持超过 7 位的精度。我假设他们使用双精度作为中间值。
  • @RudyVelthuis 也不是我——但它绝对没有使用双精度,因为它实际上只存储在 4 个字节中。
  • @MatthewWatson:嗯……很奇怪。好的,log10(2^24) 比精确的 7 略多,所以它可能适用于 12345678,但例如不适用于 12345679(或其他两个连续的 8 位值)。而 G9 只是一种输出格式。
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 2014-08-05
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多