MongoDB中的Double舍入错误()

问题描述:

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

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

  // 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({键:{ “glossary.GlossDiv.title”:真},减少:功能(OBJ,出){out.total + = obj.glossary.GlossDiv.price;},初步:{总:0}}) [{ “glossary.GlossDiv.title”: “S”, “总”:299899.99999995757}]

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

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

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

const double price = 29.99; 

这将price等于double值,它是最接近 29.99。那是不是 29.99。确切地说,你的价值是29.989999999999998436805981327779591083526611328125。

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

有关更多信息,请参阅我的文章binary floating pointdecimal floating point

+0

没有。我不相信Mongo支持小数。我认为这是根本的。如果我在C#中计算双精度值,那么我很惊讶,看不到我没有想到的东西。我已经在考虑使用整数,因为我读过一些东西,但我很想知道为什么当Mongo似乎接受一个带小数点的数字时。谢谢约翰! – cirrus 2012-03-29 16:44:40