Python fastavro错误地转换浮动

时间:2017-08-22 22:13:25

标签: python avro

我无法理解我在使用fastavro(以及常规avro)转换我的avro架构中定义为float的数字时遇到的问题。我确定它与数据类型存储有关,我只是不明白。简而言之,我将记录传递给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作为类型时,较小的值不会出现此行为。

1 个答案:

答案 0 :(得分:0)

查看avro规范https://avro.apache.org/docs/1.8.1/spec.html

浮点数写为4个字节。使用等同于Java的floatToIntBits的方法将float转换为32位整数,然后以little-endian格式进行编码。

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