gpt4 book ai didi

mongodb - 使用 MongoDB 聚合框架四舍五入到小数点后 2 位

转载 作者:IT老高 更新时间:2023-10-28 13:05:01 27 4
gpt4 key购买 nike

我正在使用 mongodb 聚合框架并进行如下所示的一些计算

db.RptAgg.aggregate( 
{$group: {
_id: {Region: "$RegionTxt", Mth: "$Month"},
ActSls: {$sum:"$ActSls"},
PlnSls: {$sum:"$PlnSls"}
}},
{$project: {
ActSls: 1,
PlnSls: 1,
ActToPln: {$cond: [
{$ne: ["$PlnSls", 0]},
{$multiply: [{$divide: ['$ActSls', '$PlnSls']}, 100]},
0
]}
}}
);

我正在尝试找出将我的结果四舍五入到小数点后 2 位的最佳和最简单的方法。以下是我的结果

{
"result": [{
"_id": {
"Region": "East",
"Mth": 201301
},
"ActSls": 72,
"PlnSls": 102,
"ActToPln": 70.58823529411765
}],
"ok": 1
}

我希望 "ActToPln"在聚合框架本身的结果中显示 70.59 而不是 "ActToPln": 70.58823529411765。我想避免在我的应用程序中进行舍入

你能帮忙吗?

以下是我使用的数据集。

{
"_id" : ObjectId("51d67ef69557c507cb172572"),
"RegionTxt" : "East",
"Month" : 201301,
"Date" : "2013-01-01",
"ActSls" : 31,
"PlnSls" : 51
}
{
"_id" : ObjectId("51d67ef69557c507cb172573"),
"RegionTxt" : "East",
"Month" : 201301,
"Date" : "2013-01-02",
"ActSls" : 41,
"PlnSls" : 51
}

提前致谢。南都

最佳答案

没有 $round 运算符,但您可以在聚合框架中执行此操作 - 按特定顺序执行通常可以避免浮点精度问题。

> db.a.save({x:1.23456789})
> db.a.save({x:9.87654321})
> db.a.aggregate([{$project:{ _id:0,
y:{$divide:[
{$subtract:[
{$multiply:['$x',100]},
{$mod:[{$multiply:['$x',100]}, 1]}
]},
100]}
}}])
{ "y" : 1.23 }
{ "y" : 9.87 }

鉴于问题中存在的管道,替换:

{$multiply:[{$divide: ['$ActSls', '$PlnSls']},100]}

{$divide:[
{$subtract:[
{$multiply:[
{$divide: ['$ActSls','$PlnSls']},
10000
]},
{$mod:[
{$multiply:[{$divide: ['$ActSls','$PlnSls']}, 10000 ]},
1]}
]},
100
]}

使用您的示例数据点,结果如下:

{ "ActSls" : 31, "PlnSls" : 51, "ActToPln" : 60.78 }
{ "ActSls" : 41, "PlnSls" : 51, "ActToPln" : 80.39 }
{ "ActSls" : 72, "PlnSls" : 102, "ActToPln" : 70.58 }

关于mongodb - 使用 MongoDB 聚合框架四舍五入到小数点后 2 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17482623/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com