今天对接接口时候发现一个问题,上层系统中传了一个int类型的id给我,我这边接收到的却是double类型,不管是项目中还是postman测试都是传的double类型,可是上层系统定义的就是int类型而且他本地postman测试的也显示的是int类型,于是我上网查找资料,最终发现了一篇博客有记录该问题。
java maptolong_Gson解析Map数据结构导致的long类型转变成double类型的案例_杨小乱的博客-CSDN博客
由于该博客的排版等问题,我这边就大致的解释一番。
由于接口之间一般使用json传递数据,由于上层系统中map未定义具体类型,因此Gson在解析该map时候,在源码的ObjectTypeAdapter .java文件中的read方法会进行判断数据类型并解析显示
@Override public Object read(JsonReader in) throws IOException {
JsonToken token = in.peek();
switch (token) {
case BEGIN_ARRAY:
List
由此,会发现分支为NUMBER,会转换为double类型显示
其实这里不但是int类型会被转变成double类型,long类型,short,byte 都会
解决该问题的方法:
如果上层系统所传的map只包含一种类型的话,可以指定数据类型
如Map
如果包含多种数据类型的话,上层系统无法改,只能自己这边将double转为int类型。
以下提供两种double转int方法,一种是强制转化不过有些情况会出现精度丢失情况,一种是利用
DecimalFormat来进行转换,返回值为String类型再转为int类型即可
//double转int
public static void doubleCastInt(){
double a = 1.25;
double b = 2.3*100;
//方法一:强制转化,大部分情况下是没有问题的,但是遇到一些情况会出现精度丢失
int i = new Double(a).intValue();
int j = new Double(b).intValue();
//方法二:使用DecimalFormat
String m = new DecimalFormat("0").format(a);
int m1 = Integer.parseInt(m);
String n = new DecimalFormat("0").format(b);
int n1 = Integer.valueOf(n).intValue();
System.out.println(i);
System.out.println(j);
System.out.println(m);
System.out.println(n);
System.out.println(m1);
System.out.println(n1);
}



