C#将双精度转换为字符串剪切一些最后的数字
我有双精度的纬度和经度,我想把它们转换成带点的字符串格式。因此,我使用:C#将双精度转换为字符串剪切一些最后的数字,c#,string,double,type-conversion,rounding,C#,String,Double,Type Conversion,Rounding,我有双精度的纬度和经度,我想把它们转换成带点的字符串格式。因此,我使用: start_lon.ToString(CultureInfo.InvariantCulture) 我得到了正确的格式(我得到了点),但我发现有时我遗漏了最后的一些数字。为什么会这样?例如,我得到了数字16.597571661711296,我得到了字符串“16.5975716617113”。我知道这个数字是“四舍五入”(不确定是否是正确的英语单词),但为什么?我如何解决这个问题?double的精度为15-16位。 这就是为
start_lon.ToString(CultureInfo.InvariantCulture)
我得到了正确的格式(我得到了点),但我发现有时我遗漏了最后的一些数字。为什么会这样?例如,我得到了数字16.597571661711296,我得到了字符串“16.5975716617113”。我知道这个数字是“四舍五入”(不确定是否是正确的英语单词),但为什么?我如何解决这个问题?
double
的精度为15-16位。
这就是为什么它四舍五入到那个数字
更多信息请点击这里
double
的精度为15-16位。
这就是为什么它四舍五入到那个数字
更多信息请点击这里
数字格式包含一个十进制数字,因此您应该更改它以确保获得所需的结果
var nfi = (System.Globalization.NumberFormatInfo)System.Globalization.CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberDecimalDigits = xxx;
start_lon.ToString(nfi);
数字格式包含一个十进制数字,因此您应该更改它以确保获得所需的结果
var nfi = (System.Globalization.NumberFormatInfo)System.Globalization.CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberDecimalDigits = xxx;
start_lon.ToString(nfi);
我怎样才能解决这个问题
使用decimal
类型而不是double
decimal n = 16.597571661711296M;
// This writes: 16.597571661711296
Console.WriteLine(n.ToString("G", CultureInfo.InvariantCulture));
我怎样才能解决这个问题
使用decimal
类型而不是double
decimal n = 16.597571661711296M;
// This writes: 16.597571661711296
Console.WriteLine(n.ToString("G", CultureInfo.InvariantCulture));
注意:对于将来的读者,您可以使用往返格式说明符始终获取最合适的数字: 默认情况下,返回值仅包含15位精度,但内部最多保留17位精度。如果此实例的值大于15位,则ToString将返回正数infinitySymbol或负数infinitySymbol,而不是预期的数字。如果需要更高的精度,请使用“G17”格式规范指定格式,该格式规范始终返回17位精度,或使用“R”格式规范,如果数字可以用该精度表示,则返回15位;如果数字只能用最大精度表示,则返回17位
这适用于双精度以及浮点数/单精度。注意:对于未来的读者,您可以使用往返格式说明符始终获取最合适的数字: 默认情况下,返回值仅包含15位精度,但内部最多保留17位精度。如果此实例的值大于15位,则ToString将返回正数infinitySymbol或负数infinitySymbol,而不是预期的数字。如果需要更高的精度,请使用“G17”格式规范指定格式,该格式规范始终返回17位精度,或使用“R”格式规范,如果数字可以用该精度表示,则返回15位;如果数字只能用最大精度表示,则返回17位 这适用于双打和浮动/单打