首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python fastavro不正确转换浮点数

Python fastavro不正确转换浮点数
EN

Stack Overflow用户
提问于 2017-08-22 22:13:24
回答 1查看 1.4K关注 0票数 4

我很难理解在使用fastavro (以及普通avro)来转换在我的avro模式中定义为浮动的数字时遇到的一个问题。我确信这与数据类型存储有关,我只是不明白。简而言之,我将一个记录传递到fastavro.dump,然后将结果传回fastavro.load,当值超过~9位时,对/从的转换不会返回相同的结果。

代码语言:javascript
复制
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'])

输出如下所示:

代码语言:javascript
复制
1111000000
1111000064.0

我希望转换引入.0,但是值的实际变化使我感到困惑。随着输入值的变化,两者之间的差异也在-63到+64之间(这可能指向实际发生的情况)。就我的测试而言,将模式中的类型更改为double/long/int似乎纠正了这个问题。当使用浮点数作为类型时,较小的值不会显示此行为。

EN

回答 1

Stack Overflow用户

发布于 2017-09-04 12:28:46

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

浮点数被写成4个字节。浮点数被转换成一个32位整数,使用一个与Java的floatToIntBits等效的方法,然后用小endian格式编码。

因此,准确性的下降是可以预测的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45827782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档