在字典中失去浮点精度

0 投票
1 回答
709 浏览
提问于 2025-04-18 18:20
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,实际存储的数字会稍微有点不同。而最接近的十进制表示也不一样。所以这个逻辑必须考虑能进行多少舍入,才能仍然读回正确的值。

撰写回答