我有双倍的纬度和经度,我想用点将它们转换为字符串格式。所以我正在使用:
start_lon.ToString(CultureInfo.InvariantCulture)
我得到了正确的格式(我得到了点),但我发现有时我会遗漏一些最后的数字。为什么会这样?例如,我得到了号码 16.597571661711296,我得到了这个字符串“16.5975716617113”。我知道这是数字的“四舍五入”(不确定它是否是正确的英文单词),但为什么呢?我该如何解决这个问题?
我有双倍的纬度和经度,我想用点将它们转换为字符串格式。所以我正在使用:
start_lon.ToString(CultureInfo.InvariantCulture)
我得到了正确的格式(我得到了点),但我发现有时我会遗漏一些最后的数字。为什么会这样?例如,我得到了号码 16.597571661711296,我得到了这个字符串“16.5975716617113”。我知道这是数字的“四舍五入”(不确定它是否是正确的英文单词),但为什么呢?我该如何解决这个问题?
double
精度为 15-16 位。这就是为什么它四舍五入到这个数字。
更多信息在这里 http://msdn.microsoft.com/en-us/library/678hzkk9(v=vs.71).aspx
数字格式包含许多十进制数字,因此您应该更改它以确保您将获得所需的结果。
var nfi = (System.Globalization.NumberFormatInfo)System.Globalization.CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberDecimalDigits = xxx;
start_lon.ToString(nfi);
对于未来的读者,请注意,您可以使用往返格式说明符来始终获得最合适的数字:
默认情况下,返回值仅包含 15 位精度,尽管内部维护最多 17 位。如果此实例的值大于 15 位,则 ToString 返回 PositiveInfinitySymbol 或 NegativeInfinitySymbol 而不是预期的数字。如果您需要更高的精度,请使用“G17”格式规范指定格式,它始终返回 17 位精度,或“R”,如果数字可以用该精度表示,则返回 15 位数字,如果数字只能表示,则返回 17 位数字以最高精度表示。
string valueString = initialValue.ToString("R", CultureInfo.InvariantCulture);
这适用于双打以及浮动/单打。
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));