2011-02-23 25 views
1

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

回答

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 
+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

0

我無法重現你所描述的。我可以保存並從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

0

下面是一個使用該Update.Set方法的另一個測試:

http://www.pastie.org/1599777

我依然看不到的精度損失存儲值時,到數據庫和閱讀他們回來。

你不會說你XX的典型值是什麼。我在測試中使用了12個。

請注意,double僅具有稍微超過15位十進制數字的總精度(小數點位置無關緊要),因此,您的值越大,剩下的精度就越低小數點。

如果您僅僅超出64位IEEE double類型的精度限制,這與C#驅動程序或MongoDB無關。

0

感謝Sam和bugai的幫助。當然,所有的答案都是正確的。這是C#的雙重限制,並在C#中打印,比如上層文章中的Bugai。我在這裏發佈用於像我這樣的其他用戶的邏輯,這個用戶使用這個小數點數量輸了北。不使用雙?不接受往返格式。在您的輸出中使用往返格式化程序到Api。感謝comprension。獲取位置現在有15位小數。 P.R

​​