1

我是 MongoDB 的新手并尝试了一些基础知识,但这让我感到惊讶。我猜我误解了一些核心概念,但谁能告诉我这里发生了什么?

使用官方 MongoDB C# 驱动器,我已将 10,0000 个这些文档插入到名为“lots”的数据库集合中。

         // Insert some test data
         const double price = 29.99;
         var bsonDoc = new BsonDocument { 
            {"glossary", new BsonDocument {
                    {"title", "example glossary"},
                    {"GlossDiv", new BsonDocument {
                        {"title", "S"},
                        {"price", new BsonDouble(price)},
                ...
                /* full doc chunk removed here for brevity */
                ...
            };
            ...
                         const int numObjects = 10000;
         for (int i = 0; i < numObjects; i++)
             col.Insert(new BsonDocument(bsonDoc));

            ...

我在 shell 中尝试了这个,因为我不相信我在 C# 驱动程序中看到的内容,但结果是一样的;

db.lots.group({key:{"glossary.GlossDiv.title":true}, reduce:function(obj,out){out.total+=obj.glossary.GlossDiv.price;}, 初始值:{total:0 } }) [ { "glossary.GlossDiv.title" : "S", "total" : 299899.99999995757 } ]

如果我错了,请纠正我,但不应该 29.99*10000 == 299900吗?

4

1 回答 1

3

如果我错了,请纠正我,但不应该 29.99*10000 == 299900 吗?

您的数据不包含 29.99。看这里:

const double price = 29.99;

price等于最接近29.99的double值。那不是29.99。确切地说,您的值是 29.989999999999998436805981327779591083526611328125。

这与 Mongo 无关——它是使用二进制浮点的基础。如果 Mongo 支持decimal,您应该将其用于任何财务价值。我看不到我所期望的任何东西BsonDecimal——如果你不能这样做,你可能希望将你的值存储为缩放整数——例如存储美分数而不是美元数。

有关更多信息,请参阅我关于二进制浮点十进制浮点的文章。

于 2012-03-29T16:34:23.883 回答