转换为字符串时如何防止我的双精度值被舍入?我都试过了Convert.ToString
,ToString()
结果是一样的。
例如,我的 double 可能看起来像77.987654321
,并且两个字符串转换转换为77.98765
。我需要保持值的精度不变。
默认情况下,该.ToString()
方法Double
返回 15 位精度。如果您想要 double 值在内部保存的完整 17 位数字,则需要将“G17”格式说明符传递给该方法。
String s = value.ToString("G17");
来自MSDN 文档:
默认情况下,返回值仅包含 15 位精度,尽管内部维护最多 17 位。如果此实例的值大于 15 位,则 ToString 返回 PositiveInfinitySymbol 或 NegativeInfinitySymbol 而不是预期的数字。如果您需要更高的精度,请使用“G17”格式规范指定格式,它始终返回 17 位精度,或“R”,如果数字可以用该精度表示,则返回 15 位数字,如果数字只能表示,则返回 17 位数字以最高精度表示。
Jon Skeet 的DoubleConverter
类有一个ToExactString()
方法,它将以字符串的形式返回 double 的确切值。
我认为舍入最后两位数字的主要答案是隐藏由于浮点/双有限精度导致的数值不稳定性/舍入。
没有四舍五入的例子:
(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907"
(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898"
最后三位看起来有点奇怪,对吧?
舍入示例:
(Math.Sqrt(7)).ToString() = "2.64575131106459"
(Math.Sqrt(7)+6).ToString() = "8.64575131106459"
看起来“完美”,对吧?
:-)
对于使用 .NET/.NET Core 更新版本的任何人:
.NET Core 3.0 引入了一项重大更改,该更改double.ToString()
不再"G15"
用作默认格式。而是ToString()
返回解析时返回相同值的最短字符串。
因此,为了保持精度,您可以简单地使用ToString()
.
这类似于旧版本的"R"
格式说明符,但在此更改之前,即使这样也显然不是 100% 准确的。
没有保证,但请尝试 ToString("R")。