栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

项目定义的是int类型,通过接口调用却变为double类型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

项目定义的是int类型,通过接口调用却变为double类型

        今天对接接口时候发现一个问题,上层系统中传了一个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 list = new ArrayList();
      in.beginArray();
      while (in.hasNext()) {
        list.add(read(in));
      }
      in.endArray();
      return list;

    case BEGIN_OBJECT:
      Map map = new linkedTreeMap();
      in.beginObject();
      while (in.hasNext()) {
        map.put(in.nextName(), read(in));
      }
      in.endObject();
      return map;

    case STRING:
      return in.nextString();

    case NUMBER:
      return in.nextDouble();

    case BOOLEAN:
      return in.nextBoolean();

    case NULL:
      in.nextNull();
      return null;

    default:
      throw new IllegalStateException();
    }
  } 

由此,会发现分支为NUMBER,会转换为double类型显示

其实这里不但是int类型会被转变成double类型,long类型,short,byte 都会

解决该问题的方法:

如果上层系统所传的map只包含一种类型的话,可以指定数据类型

如Map map = new HashMap<>();

如果包含多种数据类型的话,上层系统无法改,只能自己这边将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);
    }

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号