MongoDB C#offi:Lat,Lng作为双精度被存储在精度13和舍入?

问题描述:

我将lat和lng存储为MondoDB和C#官方驱动程序中的双精度值。在MondoDB(由驾驶员或实习生)舍入doubley值后,我的问题与我的观点不匹配。在发布到Repository之前,我已经搜索了所有可能的四舍五入,但没有发现任何内容。为什么不使用小数,因为Query.Near使用双打。
v1.6.5; C#v0.11; Win64平台。MongoDB C#offi:Lat,Lng作为双精度被存储在精度13和舍入?

XX.444057295828145; XX.63416004180907捕获作为字符串 XX.444057295828145; XX.63416004180907收据保存方法之前通过库 MongoDB的内部并返回: XX.4440572958281,XX.6341600418091,已保存和只有后返回(13 dot)

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

我用这个方法更新

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

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

我知道。但我不打印或更改直接更新此代码并在文档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) ) – user325558 2011-02-23 21:44:33

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

http://www.pastie.org/1599603

作为一个额外的测试,我验证文件内容中使用蒙戈外壳的数据库。

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

+0

嗨,山姆,是的是返回AsDouble值,但不是具有相同的精度。点后双精度值在数据库中舍入为13位十进制数。你能抽出你的样品吗?您的示例只控制了双精度但不精确。 – user325558 2011-02-23 21:17:58

+0

我不同意。数据库不是舍入到13位小数。运行我提供的测试代码并检查数据库中的文档。下面是Mongo shell的输出:> db.test.find() {“_id”:ObjectId(“4d6576bce447ad30d8a2ffcb”),“x”:12.444057295828145,“y”:12.63416004180907} >注意,没有精度损失。 – 2011-02-23 21:27:36

+0

是的,测试代码正在从数据库中检索返回的值,并检查它们是否与原始值相等(换句话说,没有精度损失)。您也可以在调试器中查看这些值以进行验证。 – 2011-02-23 21:30:54

下面是一个使用该Update.Set方法的另一个测试:

http://www.pastie.org/1599777

我依然看不到的精度损失存储值时,到数据库和阅读他们回来。

你不会说你XX的典型值是什么。我在测试中使用了12个。

请注意,double仅具有稍微超过15位十进制数字的总精度(小数点位置无关紧要),因此,您的值越大,剩下的精度就越低小数点。

如果您仅仅超出64位IEEE double类型的精度限制,这与C#驱动程序或MongoDB无关。

感谢Sam和bugai的帮助。当然,所有的答案都是正确的。这是C#的双重限制,并在C#中打印,比如上层文章中的Bugai。我在这里发布用于像我这样的其他用户的逻辑,这个用户使用这个小数点数量输了北。不使用双?不接受往返格式。在您的输出中使用往返格式化程序到Api。感谢comprension。获取位置现在有15位小数。 P.R

​​