Bezdepbonusu7Программирование: статьи и ответы

Вопрос

System.FormatException: 24201: значения широты должны быть от -90 до 90 градусов.

Автор вопроса: nLLОтветов: 2

ОБНОВИТЬ

Проблема заключалась в локали пользователя! Я решил проблему с

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

Актуальный вопрос

Это моя первая попытка реализовать местоположение на моем мобильном сайте. Я получаю местоположение пользователя со своего телефона с помощью API геолокации w3 и конвертирую его в double, а затем сохраняю его как float в 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);
}

CreateParameter

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
  • Вы должны опубликовать свой ввод, вычисление, которое вы выполняете, и фактическую часть, в которой вы форматируете результат. NotMe 05.12.2011
  • Слишком много цифр не имеет ничего общего с диапазоном -90 ... 90. Henk Holterman 05.12.2011
  • Я отправляю сообщения со своего телефона, но обновил вопрос, указав точную широту. Обновим остаток битового слоя nLL 05.12.2011
  • E+16 это твоя проблема. Вы где-то теряете десятичную точку? Rup 05.12.2011
  • Я конвертирую ввод в двойной формат и сохраняю на SQL-сервере. Тип данных - плавающий в столбце SQL-сервера nLL 05.12.2011
  • Параметр в сохраненном продукте - @lat float nLL 05.12.2011

geolocationsql-server-2008

Ответы

Ответ 1 · nLL

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

Ответ 2 · Cade Roux

Хотя 3.1234567890123+E16 является допустимым числом с плавающей запятой, оно намного больше 90, поэтому не является допустимой широтой, которая должна находиться между -90 и +90 градусами.

Кроме того, 3.1234567890123 на самом деле 3.1234567890123+E01, поэтому я не уверен, как оно умножается на 10^16 при преобразовании, чтобы стать 3.1234567890123+E16.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы