【问题标题】:Need to store high precision decimal values in MongoDB需要在MongoDB中存储高精度十进制值
【发布时间】:2013-11-17 21:40:13
【问题描述】:

我对 MongoDB 的经验很少。我通常在大型 SQL 服务器数据库上工作。

MongoDB 只支持双精度并且没有小数。 C# 驱动程序将小数序列化为字符串。

  • 如果我将小数作为字符串存储在 MongoDB?

  • 有没有办法将小数的默认序列化设置为双精度 (AllowTruncation)而不必在每个属性上放置一个属性 财产?

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

感谢您的帮助!

更新

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

再次感谢。到目前为止,答案和 cmets 都很棒。

【问题讨论】:

标签: c# mongodb decimal


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您回答了将近 4 年的问题!
【解决方案2】:

我会部分回答你的问题(因为我对 C# 了解不多)。

如果你将小数存储为字符串,你会失去什么。

  • 平均而言,您的数字会更重(每个双数字 cost 8 bytes to store 这意味着每个超过 8 个字符的字符串都会更重)。由于这些,您的索引(如果它们将建立在这个领域将会增长)
  • 您将无法使用将数字作为参数的运算符$inc$bit$mod$min$max 和 2.6 版本中的$mul。 (可能是我忘记了什么)
  • 您将无法比较数字(可能是 '1.65' 和 '1.23' 可以作为字符串进行比较,但绝对不是带有 e 和减号的数字)。由于这种操作建立在比较之上,如$sort,所有这些$gte, $gt, $lte, $lt 都将无法正常工作。

如果将小数存储为双精度数会损失什么

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

.

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

关于第二个子问题:

有没有办法将小数的默认序列化设置为双精度 (AllowTruncation) 而不必在每个属性上放置一个属性?

我不是很明白,希望有人能解答一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多