MongoDB С# offi: Lat, Lng, поскольку двойные числа хранятся с точностью до 13 и округлением?

Я храню lat и lng как двойные в официальных драйверах MondoDB и C#. У меня есть проблемы с моими баллами, которые не совпадают с правильными местами после округления двойных значений внутри MondoDB (водителем или стажером). Я искал все возможные округления перед публикацией в репозиторий, но ничего не нашел. Почему бы не использовать десятичное число, потому что Query.Near использует двойное число.
v1.6.5 ; С#v0.11 ; Win64.

XX.444057295828145;XX.63416004180907 Захвачено как строка XX.444057295828145;XX.63416004180907 Получение репозиторием перед методом сохранения Внутри MongoDB и возвращено: XX.4440572958281, XX.634161041809 (только после dot, сохранено1809) и

Это приводит к перемещению карты. Советы. Спасибо.

Я использую этот метод обновления

public void SaveGeoPoints(String id, String lat, String lng)
{
    //--> XX.444057295828145;XX.63416004180907
    Db.repository.Update(
       Query.EQ("_id", id),
       Update.Set("Lat", double.Parse(lat))
           .Set("Lng", double.Parse(lng)));
}

person user325558    schedule 23.02.2011    source источник


Ответы (4)


формат по умолчанию для Console.WriteLine печатает только 13 цифр после запятой. Следующий фрагмент кода показывает это

    var test = "10.444057295828145";
    Console.WriteLine(test);
    var testInDouble = double.Parse(test);
    Console.WriteLine(testInDouble);
    Console.WriteLine(testInDouble.ToString("R"));
Console output is
    10.444057295828145
    10.4440572958281
    10.444057295828145
person Sridhar    schedule 23.02.2011
comment
Я знаю это. но я не печатаю и не изменяю напрямую, обновляю этот код и округляется в документе Db.Centroid.Update( Query.EQ(_id, woeid), Update.Set(Iso, iso).Set(Lat, double.Parse( 12,444057295828145)) .Set(Lng, double.Parse(12,63416004180907)) .Set(Zoom, zoom) ); - person user325558; 24.02.2011

Я не могу воспроизвести то, что вы описываете. Я могу сохранять и извлекать эти значения из MongoDB без потери точности. Вот тестовый код, который я использовал:

http://www.pastie.org/1599603

В качестве дополнительного теста я проверил содержимое документов в базе данных с помощью оболочки Mongo.

Должно быть какое-то округление происходит где-то еще. Я бы проверил все места, где вы конвертируете туда и обратно между двойниками и строками.

person Robert Stam    schedule 23.02.2011
comment
Привет, Сэм. Да возвращает значения AsDouble, но не с такой точностью. Двойные значения округляются в базе данных до 13 знаков после запятой. Можете ли вы восстановить в своем образце? Ваш образец контролирует только двойную, но не точность. - person user325558; 24.02.2011
comment
Я не согласен. База данных не округляет до 13 знаков после запятой. Запустите тестовый код, который я предоставил, и проверьте документ в базе данных. Вот вывод из оболочки Mongo: › db.test.find() { _id : ObjectId(4d6576bce447ad30d8a2ffcb), x : 12.444057295828145, y : 12.63416004180907 } › Обратите внимание, что нет потери точности. - person Robert Stam; 24.02.2011
comment
И да, тестовый код извлекает значения из базы данных и проверяет, равны ли они исходным значениям (другими словами, без потери точности). Вы также можете просмотреть значения в отладчике для проверки. - person Robert Stam; 24.02.2011
comment
Извините, Сэм, новый тест и всегда один и тот же, я добавил те же значения, что и вы, проходя через Update.Set() Update.Set(Iso, iso).Set(Lat, double.Parse(12,444057295828145)) .Set(Lng, double.Parse(12,63416004180907)) .Set(Масштаб, масштаб) ); метод и получил это с помощью MongoView Lat: 12.4440572958281, Lng: 12.6341600418091. Можете ли вы протестировать метод Update.Set, пожалуйста. - person user325558; 24.02.2011
comment
Что такое МонгоВью? Может ли это быть то, где точность теряется? - person Robert Stam; 24.02.2011

Вот еще один тест, использующий метод Update.Set:

http://www.pastie.org/1599777

Я по-прежнему не вижу потери точности при сохранении значений в базе данных и их обратном чтении.

Вы не говорите, каковы ваши типичные значения XX. Я использую 12 в тесте.

Обратите внимание, что double имеет общую точность чуть более 15 десятичных цифр (не имеет значения, где находится десятичная точка), поэтому чем больше ваши значения XX, тем меньше точности остается для использования справа от десятичной точки.

Если вы просто превышаете пределы точности 64-битного двойного типа IEEE, это не имеет ничего общего ни с драйвером С#, ни с MongoDB.

person Robert Stam    schedule 23.02.2011

Спасибо Сэму и Бугаи за эту помощь. Конечно, все ответы правильные. Это лимит C# double и печати на C# вроде точки Bugai в верхнем посте. Я размещаю здесь логику, используемую другими пользователями, такими как я, которые потеряли Север с таким количеством десятичных знаков. Не использовать двойной? не принимает формат туда и обратно. Используйте средство форматирования туда и обратно в своих выходных данных для API. Спасибо за компенсацию. Получить местоположение теперь с 15 десятичных знаков. PR

public class BsonCentroid
{
    [BsonId]
    public String Id { get; set; }
    public String Location 
    {
        get { return String.Format("{0};{1}", Lat.ToString("r"), Lng.ToString("r")); }  
    }
    public double Lat { get; set; }
    public double Lng { get; set; }
}    
person user325558    schedule 23.02.2011