2017-08-22 31 views
1

我无法理解我在使用fastavro(以及常规avro)转换在我的avro模式中定义为float的数字时遇到的问题。我确信它与我不明白的数据类型存储有关。简而言之,我将一条记录传递给fastavro.dump,然后将结果传递回fastavro.load,并且当值超过〜9位数时,转换到/ from不会返回相同的结果。python fastavro错误地转换float

import fastavro 
from io import BytesIO 

schema = { 
    'name': 'Person', 
    'type': 'record', 
    'fields': [ 
    {'name': 'EmpName', 'type': 'string'}, 
    {'name': 'ID', 'type': 'float'}]} 

origRecord = {'EmpName': 'BillyBob', 'ID': 1111000000} 

buf = BytesIO() 
fastavro.dump(buf, origRecord, schema) 
avroMsg = buf.getvalue() 

buf = BytesIO(avroMsg) 
afterConversion = fastavro.load(buf, schema) 
print(origRecord['ID']) 
print(afterConversion['ID']) 

输出看起来是这样的:

1111000000 
1111000064.0 

我想到的是,转换引入了3.0,但该数值实际上改变了我百思不得其解。随着输入值的变化(这可能指向这里实际发生的情况),两者之间的差异也从-63到+64变化。将架构中的类型更改为double/long/int 出现可以解决我的测试问题。使用float作为类型时,较小的值不会显示此行为。

+0

这是['float(单精度)数据类型](https://en.wikipedia.org/wiki/Single-precision_floating-point_format)的一个众所周知的限制。请注意,数据类型特定于avro,而不是Python。 –

+0

我不确定我是否同意这一点,但我在发布这个问题之前做了大量搜索,但没有发现其他地方也有类似问题。我想这都是关于寻找正确的事情。 – user3191044

回答