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,而用双精度数表示就有点过分了。