C#将double转换为字符串剪切最后一些数字

时间:2013-05-22 08:52:41

标签: c# string double type-conversion rounding

我的纬度和经度是双倍的,我想用dot转换为字符串格式。所以我正在使用:

start_lon.ToString(CultureInfo.InvariantCulture)

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

start_lon.ToString(nfi);

答案 2 :(得分:1)

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

  

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

MSDN Double.ToString Method

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

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

答案 3 :(得分:0)

  

我该如何解决这个问题?

使用decimal类型而不是double

decimal n = 16.597571661711296M;
// This writes: 16.597571661711296
Console.WriteLine(n.ToString("G", CultureInfo.InvariantCulture));