Python fastavro错误地转换浮点值

Python fastavro错误地转换浮点值,python,avro,Python,Avro,我在理解使用fastavro(以及常规avro)转换avro模式中定义为浮点的数字时遇到了问题。我确信它在某种程度上与数据类型存储有关,我只是不明白。简言之,我将一条记录传递到fastavro.dump,然后将结果传递回fastavro.load,当值超过9位时,到/从的转换不会返回相同的结果 import fastavro from io import BytesIO schema = { 'name': 'Person', 'type': 'record', 'fields':

我在理解使用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似乎可以纠正这个问题。使用float作为类型时,较小的值不会显示此行为

查看avro规范

浮点数写入为4个字节。使用与Java的floatToIntBits等效的方法将浮点转换为32位整数,然后以小端格式进行编码


因此,准确度的损失是可以预测的。

这是一个众所周知的缺陷。请注意,数据类型是特定于avro的,而不是Python的。我不确定我是否同意它是众所周知的,我在发布此问题之前进行了大量搜索,但在其他地方没有发现类似问题的证据。我想这一切都是为了寻找正确的东西。