2017-06-19 80 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