MongoDB C # offi: Lat, Lng как двойные значения сохраняются с точностью13 и округляются? - PullRequest
1 голос
/ 23 февраля 2011

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

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

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

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

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)));
}

Ответы [ 4 ]

0 голосов
/ 24 февраля 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; }
}    
0 голосов
/ 24 февраля 2011

формат по умолчанию для 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
0 голосов
/ 24 февраля 2011

Вот еще один тест, в котором используется метод Update.Set:

http://www.pastie.org/1599777

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

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

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

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

0 голосов
/ 24 февраля 2011

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

http://www.pastie.org/1599603

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

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

...