MongoDB C# offi:Lat、Lng 作为双精度数存储在 precision13 和舍入?

发布于 2024-10-18 14:24:45 字数 700 浏览 3 评论 0原文

我在 MondoDB 和 C# 官方驱动程序中将 lat 和 lng 作为 double 存储。我的观点存在问题,在 MondoDB 内部对双值进行舍入后(由驱动程序或实习生),这些点与正确的位置不匹配。在发布到存储库之前,我已经搜索了所有可能的舍入,但没有找到任何内容。为什么不使用十进制,因为 Query.Near 使用双精度。
v1.6.5; C#v0.11; Win64。

XX.444057295828145;XX.63416004180907 捕获为字符串 XX.444057295828145;XX.63416004180907 在 Save 方法之前由存储库接收 在 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)));
}

I store lat and lng as double in MondoDB and C# official driver. I have problems with my points that are not matching the right places after a rounding of double values internaly in MondoDB(by driver or intern). I have searched all posible rounding before post to the Repository but haven´t found anything. Why not use decimal, because Query.Near use doubles.
v1.6.5 ; C#v0.11 ; Win64.

XX.444057295828145;XX.63416004180907 Captured as string
XX.444057295828145;XX.63416004180907 Receipt by Repository before Save method
Inside MongoDB and returned :
XX.4440572958281, XX.6341600418091, Saved and returned (only 13 after dot)

This is resulting to a moved map. Advices. Thanks.

I use this Update method

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瞄了个咪的 2024-10-25 14:24:45

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

the default format for Console.WriteLine prints only 13 digits after the decimal point. The following code snippet shows this

    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
谜泪 2024-10-25 14:24:45

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

http://www.pastie.org/1599603

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

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

I am unable to reproduce what you are describing. I can save and retrieve those values from MongoDB without loss of precision. Here's the test code I used:

http://www.pastie.org/1599603

As an additional test I verified the contents of the documents in the database using the Mongo shell.

There must be some rounding going on somewhere else. I would check all places where you convert back and forth between doubles and strings.

紙鸢 2024-10-25 14:24:45

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

http://www.pastie.org/1599777

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

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

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

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

Here's another test that uses the Update.Set method:

http://www.pastie.org/1599777

I still see no loss of precision when storing values to the database and reading them back.

You don't say what your typical values of XX are. I'm using 12 in the test.

Note that double only has a total precision of slightly over 15 decimal digits (doesn't matter where the decimal point is), so the larger your values of XX the less precision that is left over to use to the right of the decimal point.

If you are simply exceeding the precision limits of the 64 bit IEEE double type that is not anything to do with either the C# driver or MongoDB.

一袭水袖舞倾城 2024-10-25 14:24:45

感谢 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; }
}    

Thanks Sam and bugai for this help. Of course all answers are corrects. It's a limits of C# double and printings in C# like point Bugai in upper post. I post here the logical used to others users like me that lost the North with this amount of decimals. Not use double? is not accepting round-trip format. Use round-trip formatter in your outputs to Api. Thanks for comprension. Get Location now having 15 decimals. P.R

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; }
}    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文