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)
我该如何解决这个问题?
不幸的是,你不能\xe2\x80\x94,至少不能直接这样做。MongoDB 将浮点数存储为双精度IEEE 浮点数,这些舍入误差是该格式固有的。
\n我注意到您在代码中使用小数\xe2\x80\x94,它们在发送到数据库之前会转换为 Python 浮点数(双精度数)。如果你想保持真正的小数精度,你必须将数字存储为字符串化的小数,这意味着你还必须放弃 MongoDB 的数字处理设施,例如$inc.
遗憾的是,这是您在大多数数据库和编程语言中都会面临的一种权衡:IEEE 浮点数是 CPU 本身处理的格式,以及任何偏离它们的尝试(使用任意精度的小数,例如decimal.Decimal)会带来很大的性能和可用性损失。
| 归档时间: |
|
| 查看次数: |
1189 次 |
| 最近记录: |