0

我有双倍的纬度和经度,我想用点将它们转换为字符串格式。所以我正在使用:

start_lon.ToString(CultureInfo.InvariantCulture)

我得到了正确的格式(我得到了点),但我发现有时我会遗漏一些最后的数字。为什么会这样?例如,我得到了号码 16.597571661711296,我得到了这个字符串“16.5975716617113”。我知道这是数字的“四舍五入”(不确定它是否是正确的英文单词),但为什么呢?我该如何解决这个问题?

4

4 回答 4

1

double精度为 15-16 位。这就是为什么它四舍五入到这个数字。

更多信息在这里 http://msdn.microsoft.com/en-us/library/678hzkk9(v=vs.71).aspx

于 2013-05-22T08:55:18.397 回答
1

数字格式包含许多十进制数字,因此您应该更改它以确保您将获得所需的结果。

var nfi = (System.Globalization.NumberFormatInfo)System.Globalization.CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberDecimalDigits = xxx;

start_lon.ToString(nfi);
于 2013-05-22T08:57:35.327 回答
1

对于未来的读者,请注意,您可以使用往返格式说明符来始终获得最合适的数字:

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

MSDN Double.ToString 方法

string valueString = initialValue.ToString("R", CultureInfo.InvariantCulture);

这适用于双打以及浮动/单打。

于 2019-09-09T15:07:19.657 回答
0

And how can I fix this?

Use decimal type instead of the double

decimal n = 16.597571661711296M;
// This writes: 16.597571661711296
Console.WriteLine(n.ToString("G", CultureInfo.InvariantCulture)); 
于 2013-05-22T09:01:03.283 回答