Kafka Avro - 浮点值的精度变化
Kafka Avro - Precision change for float value
我们正在使用架构注册表将 json 条记录从 nifi 推送到 kakfa 主题。
架构:
"type": "record",
"name": "Name",
"fields": [{
"name": "latitude",
"type": [
"null",
"float"
]
},
{
"name": "longitude",
"type": [
"null",
"float"
]
}]
示例 1 -
输入记录:
{"import_latitude":38.090925000000,"import_longitude":8.677760000000}
输出记录(kafka主题):{"latitude":{"float":38.090923},"longitude":{"float":8.67776}}
38.090925000000 --> 38.090923
示例 2 -
输入记录:{"import_latitude":38.090926000000,"import_longitude":8.677760000000}
输出记录(kafka主题):{"latitude":{"float":38.090927},"longitude":{"float":8.67776}}
kafka avro 模式有这个问题吗?
看起来你得到了预期的结果!这与 Avro 无关,但与 32 位浮点精度(即 6/7 有效数字)有关。
无论你怎么看 float
:
,你都可以在 Java 中看到这个
System.out.println(Float.parseFloat("38.090925000000")); // 38.090923
System.out.println((float) 8.677760000000d); // 8.67776
System.out.println(38.090926000000f); // 38.090927
System.out.println(new Double(8.677760000000).floatValue()); // 8.67776
您的 JSON 地理坐标似乎有 8 位或 14 位有效数字。
如果需要,您可以使用 Avro DOUBLE
(15/16 位有效数字)而不是 FLOAT
,请记住,某些十进制文本表示法可能不准确以二进制表示,无论您分配多少位。
从很多方面来说,用浮点数表示 long/lat 是 accurate enough,而用双精度数表示就有点过分了。
我们正在使用架构注册表将 json 条记录从 nifi 推送到 kakfa 主题。
架构:
"type": "record",
"name": "Name",
"fields": [{
"name": "latitude",
"type": [
"null",
"float"
]
},
{
"name": "longitude",
"type": [
"null",
"float"
]
}]
示例 1 -
输入记录:
{"import_latitude":38.090925000000,"import_longitude":8.677760000000}
输出记录(kafka主题):{"latitude":{"float":38.090923},"longitude":{"float":8.67776}}
38.090925000000 --> 38.090923
示例 2 -
输入记录:{"import_latitude":38.090926000000,"import_longitude":8.677760000000}
输出记录(kafka主题):{"latitude":{"float":38.090927},"longitude":{"float":8.67776}}
kafka avro 模式有这个问题吗?
看起来你得到了预期的结果!这与 Avro 无关,但与 32 位浮点精度(即 6/7 有效数字)有关。
无论你怎么看 float
:
System.out.println(Float.parseFloat("38.090925000000")); // 38.090923
System.out.println((float) 8.677760000000d); // 8.67776
System.out.println(38.090926000000f); // 38.090927
System.out.println(new Double(8.677760000000).floatValue()); // 8.67776
您的 JSON 地理坐标似乎有 8 位或 14 位有效数字。
如果需要,您可以使用 Avro DOUBLE
(15/16 位有效数字)而不是 FLOAT
,请记住,某些十进制文本表示法可能不准确以二进制表示,无论您分配多少位。
从很多方面来说,用浮点数表示 long/lat 是 accurate enough,而用双精度数表示就有点过分了。