1

我在 MondoDB 和 C# 官方驱动程序中将 lat 和 lng 存储为双精度。在 MondoDB 内部(由驱动程序或实习生)四舍五入后,我的点与正确的位置不匹配。在发布到存储库之前,我已经搜索了所有可能的舍入,但没有找到任何东西。为什么不使用小数,因为 Query.Near 使用双精度数。
v1.6.5;C#v0.11 ; WIN64。

XX.444057295828145;XX.63416004180907 捕获为字符串 XX.444057295828145;XX.63416004180907 存储库在保存方法之前在 MongoDB 内部接收并返回:XX.4440572958281, XX.6341600418091 后返回 MongoDB

这导致了移动的地图。建议。谢谢。

我使用这个更新方法

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

4 回答 4

0

我无法重现您所描述的内容。我可以在不损失精度的情况下从 MongoDB 中保存和检索这些值。这是我使用的测试代码:

http://www.pastie.org/1599603

作为附加测试,我使用 Mongo shell 验证了数据库中文档的内容。

必须在其他地方进行一些舍入。我会检查所有在双打和字符串之间来回转换的地方。

于 2011-02-23T21:13:09.580 回答
0

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
于 2011-02-23T21:34:47.230 回答
0

这是另一个使用 Update.Set 方法的测试:

http://www.pastie.org/1599777

在将值存储到数据库并读回它们时,我仍然没有看到精度损失。

你没有说你的 XX 的典型值是什么。我在测试中使用 12。

请注意,double 的总精度仅略高于 15 个小数位(与小数点在哪里无关),因此 XX 的值越大,用于小数点右侧的精度就越低。

如果您只是超出了与 C# 驱动程序或 MongoDB 无关的 64 位 IEEE 双精度类型的精度限制。

于 2011-02-23T21:53:45.347 回答
0

感谢 Sam 和 bugai 的帮助。当然,所有答案都是正确的。这是 C# double 和 C# 中的打印的限制,如上帖中的点 Bugai。我在这里发布了用于像我这样的其他用户使用这么多小数失去北方的逻辑。不使用双?不接受往返格式。在 Api 的输出中使用往返格式化程序。感谢您的压缩。获取位置现在有 15 位小数。公关

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; }
}    
于 2011-02-23T23:32:55.480 回答