如何让MongoDB中$inc操作结果自动保留两位小数(四舍五入)
解决MongoDB $inc操作后浮点数精度问题
直接使用MongoDB的聚合管道更新语法,结合$round操作符将计算结果四舍五入到两位小数,替代单纯的$inc操作,既能保证原子性又能解决精度问题:
money = 4.92 from_snowflake = "19251" await db["bank"].update_one( {"snowflake": str(from_snowflake)}, [ {"$set": { "balance": {"$round": [{"$subtract": ["$balance", float(money)]}, 2]} }} ] )
说明
- 采用聚合管道更新方式,通过
$subtract计算当前余额与指定金额的差值,再用$round强制保留两位小数,最后用$set完成字段更新。 - 该操作是原子性的,避免了先查询再更新可能引发的并发问题,直接在数据库层面处理精度,比Python端计算后再更新更可靠。
如果偏好保留$inc的逻辑,也可以分两步完成更新(先增减再修正精度),但效率略低于上述一步到位的方法:
await db["bank"].update_one( {"snowflake": str(from_snowflake)}, [ {"$inc": {"balance": -float(money)}}, {"$set": {"balance": {"$round": ["$balance", 2]}}} ] )
内容的提问来源于stack exchange,提问作者Krzychu1289
相关产品推荐
相关产品推荐

