Kafka Consumer以字符串格式舍入小数

时间:2018-11-27 13:19:40

标签: java apache-kafka avro kafka-consumer-api

我有一个Avro格式的主题,其中包含类似于以下内容的数据:

{  
  "data":{  
    "NAME":{  
      "string":"GIORGOS"
    },
    "BALANCE":{  
      "string":"154711.5800000000"
    }
  },
  "op":"INSERT"
}

和使用此主题中数据的Kafka使用者(我的接收器连接器包含一些转换,因此仅解析data片段)

while (true) {
    try {
        ConsumerRecords<String, GenericRecord> records = consumer.poll(200);
        for (ConsumerRecord<String, GenericRecord> record : records) {
            System.out.println("TESTING 1: " + record.value());
            System.out.println("TESTING 2: " + record.value().toString());
        }       
    } catch(Exception ex) {
        ex.printStackTrace();             
    }
}

输出为:

TESTING 1: {"NAME": "GIORGOS", "BALANCE": 154712.0}
TESTING 2: {"NAME": "GIORGOS", "BALANCE": 154712.0}

这里的问题是主题中的原始BALANCE154561.5800000000,但Kafka Consumer正在将该值四舍五入到154712.0

我还注意到,3982.95左边最多4位的值不被四舍五入,而左边5位数字(例如43982.68)的值将四舍五入到小数点后一位点(43982.7)。

我应该如何处理此问题?

1 个答案:

答案 0 :(得分:0)

您为什么将数据类型string用于 BALANCE

https://avro.apache.org/docs/1.8.2/spec.html#schema_primitive

您可以改用floatdouble

{  
"data":{  
    "NAME":{  
    "string":"GIORGOS"
    },
    "BALANCE":{  
    "float":154561.5800000000
    }
},
"op":"INSERT"
}