MongoDB 缺乏精确递增浮点数

MFB*_*MFB 0 python floating-accuracy mongodb

我有一个问题,因为 MongoDB 在增加浮点数时似乎无法保持精度。例如,以下应该产生2.0

from decimal import Decimal  # For Python precision
for i in range(40):
    db.test.update({}, {'$inc': {'count': float(Decimal(1) / 20)}}, upsert=True)
print db.test.find_one()['count']
Run Code Online (Sandbox Code Playgroud)

输出:

2.000000000000001
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Max*_*oel 5

不幸的是,你不能\xe2\x80\x94,至少不能直接这样做。MongoDB 将浮点数存储为双精度IEEE 浮点数,这些舍入误差是该格式固有的。

\n

我注意到您在代码中使用小数\xe2\x80\x94,它们在发送到数据库之前会转换为 Python 浮点数(双精度数)。如果你想保持真正的小数精度,你必须将数字存储为字符串化的小数,这意味着你还必须放弃 MongoDB 的数字处理设施,例如$inc.

\n

遗憾的是,这是您在大多数数据库和编程语言中都会面临的一种权衡:IEEE 浮点数是 CPU 本身处理的格式,以及任何偏离它们的尝试(使用任意精度的小数,例如decimal.Decimal)会带来很大的性能和可用性损失。

\n