【发布时间】:2012-12-28 19:29:59
【问题描述】:
我有一个浮点值:12345.6489
当我使用以下格式对其进行格式化时:
(12345.6489f).ToString("F1")
然后我得到一个结果
12345.7
但这是不正确的,因为它应该是 12345.6。
有人明白为什么会发生这种情况吗?另一个提示是,在我格式化之前强制转换为双精度会返回正确的结果,如果我的浮点值小一点,例如 1234.6489,那么我也会得到正确的结果。
【问题讨论】:
-
@DavidStratton:
Double也不准确,并且会给出类似的奇怪现象。它们只是具有不同的精度和不同的范围。 -
@JonSkeet - 感谢您的澄清!我删除了评论。
-
Single.ToString 正在做一些非常奇怪的事情。我认为您需要查看IL。文档 (msdn.microsoft.com/en-us/library/f71z6k0c.aspx) 说“默认情况下,返回值仅包含 7 位精度,尽管内部维护最多 9 位”但我确定我不知道这意味着什么。
-
嗯,
[MethodImpl(MethodImplOptions.InternalCall)],所以没有 IL。 -
@DavidHeffernan 值得注意的是,虽然在大多数区域中,
float比具有 7 个有效数字的十进制数更精确,但也有一些地方这不是真的。在这些地区,你会得到有趣的结果,因为ToString()给出了 7 个十进制数字。示例:在9E+09f(90 亿)附近,7 位小数的精度为1000,而float的精度仅为1024。因此,例如float x = 9E+09f; Console.WrireLine(x);给出了一个惊喜(9,000,000,000 是 512 模 1024)。
标签: c# string floating-point format