我很难理解在使用fastavro(以及普通avro)来转换avro模式中定义为float的数字时遇到的一个问题。我敢肯定它与数据类型存储有关,我只是不明白。简而言之,我把一张唱片传给fastavro.垃圾场,然后将结果传回快速负载,当值超过~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'])
输出如下:
^{pr2}$我希望转换会引入.0,但是这些值实际上发生了变化,这让我很困惑。随着输入值的变化,两者之间的差异也在-63到+64之间变化(这可能表明这里实际发生了什么)。将模式中的类型更改为double/long/int似乎是为了纠正我的测试中的问题。当使用float作为类型时,较小的值不会表现出这种行为。在
看看avro规范https://avro.apache.org/docs/1.8.1/spec.html
一个浮点写为4个字节。使用与Java的floatToIntBits等效的方法将float转换为32位整数,然后以little-endian格式编码。
准确度的损失是可预测的。在
相关问题 更多 >
编程相关推荐