在字典中失去浮点精度
jsons = json.loads(request.data)
jsons -->
dict: {u'json_event': {u'timestamp': 1408878136.318921}}
和
json_event = jsons['json_event']
json_event -->
dict: {u'timestamp': 1408878136.318921}
但是当我使用 json_event['timestamp']
时,得到的只有两位小数:
float: 1408878136.32
有没有办法保持这个精度呢?
更新:
我觉得这不是表示的问题。
event, is_created = Event.create_or_update(json_event['event_id'],
timestamp=json_event['timestamp'])
class Event(ndb.Model):
...
timestamp = ndb.FloatProperty(required=True)
event.timestamp --> 1408878136.32
1 个回答
2
当你或者你用来打印数字的工具使用标准的字符串转换时,最多只会打印出12位有效数字:
>>> str(1408878136.318921)
'1408878136.32'
但是当你使用内置的 repr
函数时,会打印出足够的有效数字,以确保Python解析器能读回相同的值:
>>> repr(1408878136.318921)
'1408878136.318921'
所以,只需要把你要打印的内容放在手动调用 repr()
的括号里就行了。
这只是一个表示的问题。显然,JSON打印工具使用了一些逻辑(可能是通过 repr
,也可能不是)来打印足够的数字,以便能读回相同的值。但你用来打印的工具并没有这样做。
需要注意的是,这个逻辑相当复杂,因为二进制的小数和十进制的小数并不完全对应。比如 0.3
在二进制中是一个循环小数,因此如果你读取 0.3
,实际存储的数字会稍微有点不同。而最接近的十进制表示也不一样。所以这个逻辑必须考虑能进行多少舍入,才能仍然读回正确的值。