Python Mongodb缺少精度递增浮动
我有一个问题,因为Mongodb在递增浮动时似乎无法保持精度。例如,以下内容应产生Python Mongodb缺少精度递增浮动,python,mongodb,floating-accuracy,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
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
我怎样才能避开这个问题呢?不幸的是,你不能——至少不能直接这么做。Mongo将浮点数存储为双精度IEEE浮点(),这些舍入错误是格式固有的
我注意到您在代码中使用了小数——它们在被发送到DB之前被转换为Python浮点(双倍)。如果您想保持真正的十进制精度,就必须将数字存储为字符串小数,这意味着您还必须放弃Mongo的数字处理功能,如$inc
不幸的是,在大多数数据库和编程语言中,这是一种权衡:IEEE浮点数是CPU本机处理的格式,任何偏离它们的尝试(使用任意精度的小数,如decimal.decimal
)都会带来巨大的性能和可用性损失。不幸的是,你不能,至少不能直接。Mongo将浮点数存储为双精度IEEE浮点(),这些舍入错误是格式固有的
我注意到您在代码中使用了小数——它们在被发送到DB之前被转换为Python浮点(双倍)。如果您想保持真正的十进制精度,就必须将数字存储为字符串小数,这意味着您还必须放弃Mongo的数字处理功能,如$inc
不幸的是,在大多数数据库和编程语言中,这是一种权衡:IEEE浮点数是CPU本机处理的格式,任何偏离它们的尝试(使用任意精度的小数,如decimal.decimal
)都会带来巨大的性能和可用性损失。不幸的是,你不能,至少不能直接。Mongo将浮点数存储为双精度IEEE浮点(),这些舍入错误是格式固有的
我注意到您在代码中使用了小数——它们在被发送到DB之前被转换为Python浮点(双倍)。如果您想保持真正的十进制精度,就必须将数字存储为字符串小数,这意味着您还必须放弃Mongo的数字处理功能,如$inc
不幸的是,在大多数数据库和编程语言中,这是一种权衡:IEEE浮点数是CPU本机处理的格式,任何偏离它们的尝试(使用任意精度的小数,如decimal.decimal
)都会带来巨大的性能和可用性损失。不幸的是,你不能,至少不能直接。Mongo将浮点数存储为双精度IEEE浮点(),这些舍入错误是格式固有的
我注意到您在代码中使用了小数——它们在被发送到DB之前被转换为Python浮点(双倍)。如果您想保持真正的十进制精度,就必须将数字存储为字符串小数,这意味着您还必须放弃Mongo的数字处理功能,如$inc
不幸的是,在大多数数据库和编程语言中,这是一个需要权衡的问题:IEEE浮点数是CPU本机处理的格式,任何偏离它们的尝试(使用任意精度的小数,如
decimal.decimal
)性能和可用性都会受到很大的损失。可能是因为修正了客户端代码的精度。毕竟,首先提供价值的是零件。因此,请理解是您造成了问题,而不是接口。“键盘-椅子”接口问题。可能是通过修正客户端代码的精度。毕竟,首先提供价值的是零件。因此,请理解是您造成了问题,而不是接口。“键盘-椅子”接口问题。可能是通过修正客户端代码的精度。毕竟,首先提供价值的是零件。因此,请理解是您造成了问题,而不是接口。“键盘-椅子”接口问题。可能是通过修正客户端代码的精度。毕竟,首先提供价值的是零件。因此,请理解是您造成了问题,而不是接口。“键盘-椅子”界面问题。