2017-06-19 81 views
3

说我有以下聚合:MongoDB的繁殖聚集操作

db.a.aggregate(
    [ 
    { $project: { total: { $multiply: [ 4533, 0.0001 ] } } } 
    ] 
) 

此聚集的输出是0.45330000000000004时,它显然应该是0.4533。这是聚合框架中的错误吗?

+0

不,这不是一个错误。这是mongodb给你的。您可以在获得nodejs中的值后使用toFixed。或者你可以使用这个https://github.com/debitoor/mongo-round –

+1

[欢迎使用计算机科学](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) 。如果你想要不同的东西,请使用['$ trunc'](https://docs.mongodb.com/manual/reference/operator/aggregation/trunc/)。 –

+0

另请参阅:[MongoDB - 值的十进制类型?](https://stackoverflow.com/questions/11541939/mongodb-what-about-decimal-type-of-value/11542549#11542549) –

回答

0

好吧,那么我会建议乘以使用$trunc,但你基本上可以只链接$multiply$divide这里脱身:

db.a.aggregate(
    [ 
    { "$project": { 
     "total": { 
     "$divide": [ 
      { "$multiply": [ 
      { "$multiply": [ 4533, 0.0001 ] }, 
       10000 
      ]}, 
      10000 
     ] 
     } 
    }} 
    ] 
) 

或只是$divide时,那是你的意思是:

db.a.aggregate([ 
    { "$project": { "total": { "$divide": [ 4533, 10000 ] } } } 
]) 

这两者都会给你:

{ "total" : 0.4533 } 

如前所述,浮点数学和四舍五入没有什么新鲜之处,作为一门普通课程,您应该避免使用并简单应用您实际意义上的“非浮点”版本。

长时间阅读,如果你有一段时间在What Every Computer Scientist Should Know About Floating-Point Arithmetic