MongoDB C# offi:Lat、Lng 作为双精度数存储在 precision13 和舍入?
我在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Console.WriteLine 的默认格式仅打印小数点后 13 位数字。下面的代码片段展示了这一点
the default format for Console.WriteLine prints only 13 digits after the decimal point. The following code snippet shows this
我无法重现您所描述的内容。我可以从 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.
这是使用 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.
感谢 Sam 和 bugai 的帮助。当然,所有答案都是正确的。这是 C# double 和 C# 中打印的限制,就像上篇文章中的点 Bugai 一样。我在这里发布了像我这样的其他用户使用的逻辑,他们用这么多的小数失去了北方。不使用双吗?不接受往返格式。在 Api 的输出中使用往返格式化程序。感谢您的理解。获取位置现在有 15 位小数。公关
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