Python double 使用 avro 模式丢失精度
Python double loses precision using avro schema
我正在使用 'Avro' 模式序列化一些数据,代码是用 Python 编写的,我面临精度丢失的问题。看起来 Python 正在对数字四舍五入并添加科学记数法。
我看到的:
1.2345678901234568e+16
我希望看到的:
12345678901234567.19
代码示例如下。
可重现的代码示例:
from fastavro import writer, reader, parse_schema
schema = {
'doc': 'A weather reading.',
'name': 'Weather',
'namespace': 'test',
'type': 'record',
'fields': [
{'name': 'station', 'type': 'string'},
{'name': 'time', 'type': 'double'},
{'name': 'temp', 'type': 'double'},
],
}
parsed_schema = parse_schema(schema)
# 'records' can be an iterable (including generator)
records = [
{u'station': u'011990-99999', u'temp': 0, u'time': 1433269388},
{u'station': u'011990-99999', u'temp': -11, u'time': 12345678901234567.19},
{u'station': u'012650-99999', u'temp': 111, u'time': 1433275478},
]
# Writing
with open('weather.avro', 'wb') as out:
writer(out, parsed_schema, records)
# Reading
with open('weather.avro', 'rb') as fo:
for record in reader(fo):
print(record)
我相信可能有一种方法可以(覆盖)编写我自己的反序列化器,这将使我能够控制如何将双精度反序列化为字符串。
有什么想法吗?
如果您想使用自定义逻辑类型,fastavro
支持:https://fastavro.readthedocs.io/en/latest/logical_types.html#custom-logical-types。当然,如果其他实现也被使用,那么他们将无法理解自定义逻辑类型。
但是,主要问题来自几乎所有语言中都存在的浮点数舍入。确保不进行舍入的更好选择可能是使用 Decimal 类型:https://avro.apache.org/docs/current/spec.html#Decimal
我正在使用 'Avro' 模式序列化一些数据,代码是用 Python 编写的,我面临精度丢失的问题。看起来 Python 正在对数字四舍五入并添加科学记数法。
我看到的: 1.2345678901234568e+16
我希望看到的: 12345678901234567.19
代码示例如下。
可重现的代码示例:
from fastavro import writer, reader, parse_schema
schema = {
'doc': 'A weather reading.',
'name': 'Weather',
'namespace': 'test',
'type': 'record',
'fields': [
{'name': 'station', 'type': 'string'},
{'name': 'time', 'type': 'double'},
{'name': 'temp', 'type': 'double'},
],
}
parsed_schema = parse_schema(schema)
# 'records' can be an iterable (including generator)
records = [
{u'station': u'011990-99999', u'temp': 0, u'time': 1433269388},
{u'station': u'011990-99999', u'temp': -11, u'time': 12345678901234567.19},
{u'station': u'012650-99999', u'temp': 111, u'time': 1433275478},
]
# Writing
with open('weather.avro', 'wb') as out:
writer(out, parsed_schema, records)
# Reading
with open('weather.avro', 'rb') as fo:
for record in reader(fo):
print(record)
我相信可能有一种方法可以(覆盖)编写我自己的反序列化器,这将使我能够控制如何将双精度反序列化为字符串。
有什么想法吗?
如果您想使用自定义逻辑类型,fastavro
支持:https://fastavro.readthedocs.io/en/latest/logical_types.html#custom-logical-types。当然,如果其他实现也被使用,那么他们将无法理解自定义逻辑类型。
但是,主要问题来自几乎所有语言中都存在的浮点数舍入。确保不进行舍入的更好选择可能是使用 Decimal 类型:https://avro.apache.org/docs/current/spec.html#Decimal