美文网首页
数据类型的使用注意

数据类型的使用注意

作者: 咯噔ya | 来源:发表于2019-10-31 18:01 被阅读0次

    易混淆点记录:

    1.所有 整形包装类对象 之间\color{red}{值的比较},全部使用equals方法比较。
    说明:对于Integer var = ?在-128 至127 范围内的赋值,Integer对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的Integer值可以直接用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑。推荐使用equals方法进行判断。

    2.浮点数之间的等值判断,基本数据类型\color{red}{不能}== 来比较,包装数据类型\color{red}{不能}equals来判断。
    说明:浮点数采用“尾数+阶码” 的编码方式,类似科学计数法的 “有效数字+指数”的表示方式,二进制无法精确标识大部分的十进制小数,
    正例:

            float a = 1.0f - 0.9f;
            float b = 0.9f - 0.8f;
            float diff = 1e-6f;
            if (Math.abs(a - b) < diff) {
                System.out.println("true");
            }
    
            BigDecimal a = new BigDecimal("1.0");
            BigDecimal b = new BigDecimal("0.9");
            BigDecimal c = new BigDecimal("0.8");
            BigDecimal x = a.subtract(b);
            BigDecimal y = b.subtract(c);
            if (x.equals(y)) {
                System.out.println("true");
            }
    

    3.为了防止精度缺失,禁止使用构造方法\color{red}{BigDecimal(double)}的方式把值转化为BigDecimal对象。
    说明:BigDecimal(double) 存在精度损失风险,在精确计算或值比较从场景中可能会导致业务逻辑异常。
    如:BigDecimal a=new BigDecimal(0.1f);实际存储值为:0.10000000149
    正例:优先推荐入参为String 的构造方法,或者使用BigDecimal的valueOf方法,此方法内部其实执行了Double的toString,而Double的toString按Double的实际能表达的精度对尾数进行了截断。

    BigDecimal recomment1 = new BigDecimal("0.1");
    BigDecimal recomment2 = BigDecimal.valueOf(0.1);
    

    4.注意Math.random()这个方法返回的是double类型,注意取值范围0<=x<1(能够取值到零,注意除0异常),如果想获取整数类型的随机数,不要将x放大10的若干倍然后取整,直接使用Random对象的nextInt或者nextLong方法

            Random r = new Random();
            int a1 = r.nextInt();
            long a2 = r.nextLong();
    

    相关文章

      网友评论

          本文标题:数据类型的使用注意

          本文链接:https://www.haomeiwen.com/subject/dabtbctx.html