在字典中丢失浮点精度

时间:2014-08-24 11:21:04

标签: python json

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 个答案:

答案 0 :(得分:2)

当您或用于打印数字的任何工具 - 使用标准转换为字符串时,只打印12位有效数字:

>>> str(1408878136.318921)
'1408878136.32'

但是当你使用repr内置函数时,会打印足够的有效数字以确保python解析器会读回相同的值:

>>> repr(1408878136.318921)
'1408878136.318921'

所以只需在手动repr()电话中打印您正在打印的内容。

这只是代表性的问题。显然,JSON打印机使用一些逻辑(可能是通过repr或可能不是)来打印足够的数字来回读相同的值。但是您用来打印它们的工具不是。

请注意,逻辑非常复杂,因为二进制小数与小数小数并不完全对应。 0.3具有二进制的周期性表示,因此如果您阅读0.3,则存储的实际数字将具有略微不同的值。并且最接近的十进制表示是不同的。所以逻辑必须考虑它可以应用多少舍入来仍然读回正确的值。