20

转换为字符串时如何防止我的双精度值被舍入?我都试过了Convert.ToStringToString()结果是一样的。

例如,我的 double 可能看起来像77.987654321,并且两个字符串转换转换为77.98765。我需要保持值的精度不变。

4

6 回答 6

25

默认情况下,该.ToString()方法Double返回 15 位精度。如果您想要 double 值在内部保存的完整 17 位数字,则需要将“G17”格式说明符传递给该方法。

String s = value.ToString("G17");

来自MSDN 文档

默认情况下,返回值仅包含 15 位精度,尽管内部维护最多 17 位。如果此实例的值大于 15 位,则 ToString 返回 PositiveInfinitySymbol 或 NegativeInfinitySymbol 而不是预期的数字。如果您需要更高的精度,请使用“G17”格式规范指定格式,它始终返回 17 位精度,或“R”,如果数字可以用该精度表示,则返回 15 位数字,如果数字只能表示,则返回 17 位数字以最高精度表示。

于 2010-01-20T21:32:45.820 回答
15

尝试类似的东西

myDouble.ToString("R")

另请参见往返 ("R") 格式说明符

往返 ("R") 格式说明符保证转换为字符串的数值将被解析回相同的数值。

于 2010-01-20T21:31:07.153 回答
5

Jon Skeet 的DoubleConverter类有一个ToExactString()方法,它将以字符串的形式返回 double 的确切值。

http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

于 2010-01-20T21:30:47.687 回答
2

我认为舍入最后两位数字的主要答案是隐藏由于浮点/双有限精度导致的数值不稳定性/舍入。

没有四舍五入的例子:

(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"

看起来“完美”,对吧?

:-)

于 2016-02-14T11:15:21.297 回答
1

对于使用 .NET/.NET Core 更新版本的任何人:

.NET Core 3.0 引入了一项重大更改,该更改double.ToString()不再"G15"用作默认格式。而是ToString()返回解析时返回相同值的最短字符串。

因此,为了保持精度,您可以简单地使用ToString().

这类似于旧版本的"R"格式说明符,但在此更改之前,即使这样也显然不是 100% 准确的。

请参阅.NET Core 3.0 中的重大更改

于 2022-01-04T18:06:46.237 回答
0

没有保证,但请尝试 ToString("R")。

于 2010-01-20T21:31:44.343 回答