System.FormatException:24201:纬度值必须在 -90 到 90 度之间

Posted

技术标签:

【中文标题】System.FormatException:24201:纬度值必须在 -90 到 90 度之间【英文标题】:System.FormatException: 24201: Latitude values must be between -90 and 90 degrees 【发布时间】:2011-12-05 16:37:40 【问题描述】:

更新

问题是用户的语言环境! 我已经用

对问题进行了分类
double lat = double.Parse(Request.Form["lat"], CultureInfo.InvariantCulture);

实际问题

这是我第一次尝试在我的移动网站上实现定位。我正在使用 w3 地理定位 API 从他们的手机获取用户的位置并将其转换为双精度,然后将其作为浮点数存储在 sqlserver 中。

在大多数情况下,它可以正常工作,但在某些情况下,手机提供的坐标很长。例如,纬度可能是3.1234567890123,所以点后有 14 个数字。

这会保存为3.1234567890123+E16,当我尝试计算用户到某个点的距离时,会导致标题出错。

避免它的最佳方法是什么?我应该将用户的输入修剪到一定长度以便正确转换吗?

获取和保存数据的方法

double lat = Convert.ToDouble(Request.Form["lat"]);
double lng = Convert.ToDouble(Request.Form["lng"]);
user.UpdateMyLocationCoordinates(user.id, lat, lng);

public void UpdateMyLocationCoordinates(int userId, double lat, double lng)

    SiteDbHelper db = new SiteDbHelper();
    List<SqlParameter> sqlParameters = new List<SqlParameter>();
    sqlParameters.Add(db.CreateParameter("@userId", SqlDbType.Int, userId));
    sqlParameters.Add(db.CreateParameter("@latitude", SqlDbType.Float, lat));
    sqlParameters.Add(db.CreateParameter("@longitude", SqlDbType.Float, lng));
    db.UpdateInsertDeleteReturnAffectedRowCount ("SocialSiteUser_UpdateMyLocationCoordinates", CommandType.StoredProcedure, sqlParameters);

创建参数

public SqlParameter CreateParameter(string name, SqlDbType type, double value)

    SqlParameter param = new SqlParameter(name, value);
    param.SqlDbType = type;
    return param;

SP o 存储数据是

ALTER PROCEDURE [dbo].[SocialSiteUser_UpdateMyLocationCoordinates]
@userId int,
@latitude float,
@longitude float
AS
BEGIN
    SET NOCOUNT ON
    update domains_users set latitude=@latitude, longitude=@longitude where id=@userId
END

【问题讨论】:

您应该发布您的输入、您运行的计算以及您格式化结果的实际部分。 数字太多与-90 ... 90 范围无关。 我正在通过手机发帖,但使用精确的纬度输入更新了问题。将更新休息位层 E+16 是你的问题。您是否在某处丢失了小数点? 我正在将输入转换为双精度并保存到 SQL 服务器。 SQL server 列中的数据类型为浮点数 【参考方案1】:

问题是用户的语言环境!我已经对问题进行了排序

 double lat = double.Parse(Request.Form["lat"], CultureInfo.InvariantCulture);

【讨论】:

【参考方案2】:

虽然3.1234567890123+E16 是一个有效的浮点数,但它比 90 大很多,所以它不是一个有效的纬度,它必须位于 -90+90 度之间。

另外,3.1234567890123 实际上是3.1234567890123+E01,所以我不确定它是如何在转换为3.1234567890123+E16 时乘以10^16

【讨论】:

实际存储值为3.9951341674225E+16, 3.27377879977052E+16 @nLL 这些不是有效的纬度(或经度) - Request["lat"] 中的确切字符串是什么? @nLL 例如 3.9951341674225E+16 大致相当于 39951341674225000 (我们在您给出的示例中总共只有 14 位精度),所以如果您有 17 位数字,没有小数点, 它将是 X.XXXXE+16 的科学计数法。 感谢我与用户取得联系并与他们一起进行测试以了解发生了什么。我会进一步更新。 终于!我能够通过在 SP 中使用“@lat float(53)”而不是“@lat float”来使其工作

以上是关于System.FormatException:24201:纬度值必须在 -90 到 90 度之间的主要内容,如果未能解决你的问题,请参考以下文章

无法启动 Kestrel。 System.FormatException:无效的 URL:'http:////*:80'

数组中的“System.FormatException:'输入字符串格式不正确”错误

DatePicker System.FormatException

System.FormatException:索引(从零开始)必须大于或等于零且小于参数列表的大小

System.FormatException:24201:纬度值必须在 -90 到 90 度之间

aspose 单元格工作簿引发了“System.FormatException”类型的异常