MongoDB缺乏精度递增浮点数

ars1skjm  于 2023-06-05  发布在  Go
关注(0)|答案(1)|浏览(200)

我有一个问题,因为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']

输出:

2.000000000000001

我该如何解决这个问题?

nlejzf6q

nlejzf6q1#

不幸的是,你不能--至少不能直接地。MongoDB将浮点数存储为双精度IEEE floats,这些舍入错误是格式所固有的。
我注意到您在代码中使用了Decimals-它们在发送到DB之前被转换为Python浮点数(即双精度浮点数)。如果你想保持真正的十进制精度,你必须将数字存储为字符串化的Decimals,这意味着你还必须给予MongoDB的数字处理功能,如$inc
遗憾的是,这是您在大多数数据库和编程语言中都会遇到的权衡:IEEE浮点数是CPU本机处理的格式,任何偏离它们的尝试(使用任意精度的小数,如decimal.Decimal)都会带来很大的性能和可用性损失。

相关问题