C# 需要在MongoDB中存储高精度十进制值

C# 需要在MongoDB中存储高精度十进制值,c#,mongodb,decimal,C#,Mongodb,Decimal,我对MongoDB没有什么经验。我通常在大型SQLServerDBS上工作 MongoDB只支持double和,不支持十进制。C#驱动程序将小数序列化为字符串 如果我将小数存储为字符串,我会错过什么功能 MongoDB 有没有办法将小数的默认序列化设置为double (AllowRunLocation)而不必在每个 财产 如果我使用Bson double,在精度上会损失什么 谢谢你的帮助 更新 我有一个在C#中使用小数的现有应用程序模型。我想使用MongoDB作为一个新的DB层,并在现有应用

我对MongoDB没有什么经验。我通常在大型SQLServerDBS上工作

MongoDB只支持double和,不支持十进制。C#驱动程序将小数序列化为字符串

  • 如果我将小数存储为字符串,我会错过什么功能 MongoDB

  • 有没有办法将小数的默认序列化设置为double (AllowRunLocation)而不必在每个 财产

  • 如果我使用Bson double,在精度上会损失什么

谢谢你的帮助

更新 我有一个在C#中使用小数的现有应用程序模型。我想使用MongoDB作为一个新的DB层,并在现有应用程序中尽可能少地进行更改。这就是为什么我在寻找一种将C中的小数映射到MongoDB中的双精度的方法。
我知道我失去了精确性,不得不分析它的副作用。我唯一剩下的问题是,是否有办法将小数的默认序列化设置为双精度。


再次感谢。到目前为止,答案和评论都很好。

我将部分回答您的问题(因为我对C#了解不多)

那么,如果将小数存储为字符串,会有什么损失。

  • 您的数字平均会更重(每一个双倍数字意味着每一个超过8个字符的字符串都会更重)。由于这些原因,您的索引(如果在此字段上构建索引,则索引将增长)
  • 在2.6版本中,您将无法使用以数字为参数的运算符、、和。(可能是我忘了什么)
  • 您将无法比较数字(可能是“1.65”和“1.23”可以作为字符串进行比较,但绝对不能比较中间带e和负号的数字)。因为这种建立在比较之上的操作就像,所有这些都不能正常工作
如果将十进制存储为双精度,会损失多少精度:

  • 基于有28-29个有效数字,而查看我的第一个链接并检查,您会看到它有15-17个有效数字。这基本上就是你将失去的
  • 在处理双重浮动时,人们有时会忘记的另一件非常重要的事情如下所示:

关于第二个子问题:

有没有办法将小数的默认序列化设置为double (AllowRunLocation)而不必在每个属性上放置属性


我不太明白,所以我希望有人能回答。

从Mongodb 3.4和2.4 Mongodb C#驱动程序开始,支持十进制类型

文档的属性必须具有
MongoDB.Bson.Serialization.Attributes
命名空间中的
[BsonRepresentation(BsonType.Decimal128)]
属性


这将映射到MongodDB中的
“YourDecimalValue”:NumberDecimal(“100.0000”)
。Robomongo支持1.1 Beta版的新十进制类型。

如果需要十进制精度,请不要使用双精度。这样做有可能会更改数据。可能会重复。。。。还有一个悬而未决的问题:感谢您的回复!很好的信息。我仍然需要知道如何将C#中的默认小数序列化设置为双精度。所提到的问题不一样为什么不使用双打呢?非常感谢您回答了一个将近4年的问题!
db.c.insert({_id : 1, b : 3.44}) 
db.c.update({_id : 1},{$inc : {b : 1}})
db.c.find({b: 4.44})  // WTf, where is my document? There is nothing there