Mongodb缺乏精确递增浮动

时间:2015-09-29 12:35:08

标签: python mongodb floating-accuracy

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

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

不幸的是,你不能 - 至少不能直接。 Mongo将浮点数存储为双精度IEEE浮点数(https://en.wikipedia.org/wiki/IEEE_floating_point),并且这些舍入错误是格式固有的。

我注意到你在代码中使用了Decimals - 它们在被发送到数据库之前被转换为Python浮点数(它们是双精度数)。如果你想保持真正的小数精度,你必须将你的数字存储为字母化的小数,这意味着你还必须放弃Mongo的数字处理设施,例如$inc

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