我很难理解在使用fastavro (以及普通avro)来转换在我的avro模式中定义为浮动的数字时遇到的一个问题。我确信这与数据类型存储有关,我只是不明白。简而言之,我将一个记录传递到fastavro.dump,然后将结果传回fastavro.load,当值超过~9位时,对/从的转换不会返回相同的结果。
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我希望转换引入.0,但是值的实际变化使我感到困惑。随着输入值的变化,两者之间的差异也在-63到+64之间(这可能指向实际发生的情况)。就我的测试而言,将模式中的类型更改为double/long/int似乎纠正了这个问题。当使用浮点数作为类型时,较小的值不会显示此行为。
发布于 2017-09-04 12:28:46
看看avro规范https://avro.apache.org/docs/1.8.1/spec.html
浮点数被写成4个字节。浮点数被转换成一个32位整数,使用一个与Java的floatToIntBits等效的方法,然后用小endian格式编码。
因此,准确性的下降是可以预测的。
https://stackoverflow.com/questions/45827782
复制相似问题