kafka avro-浮点值的精度更改

mlmc2os5  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(487)

我们使用schema registry将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模式有问题吗?

to94eoyn

to94eoyn1#

看起来你得到了预期的结果!这与avro无关,但与32位浮点精度(即6/7有效位)有关。
无论您如何看待java,都可以在java中看到这一点 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就足够精确了,而用double表示就太过分了。

相关问题