Android开发中遇到的integer比较和double加和的问题

in blog •  6 years ago 

        这两天在开发中遇到了两个比较经典的问题,虽然都是基础的东西,但越是基础的我们有时反而没有把它弄清楚,值得记一下:
#####1、使用==比较Integer的误区

        对于Integer平时经常用算是十分熟悉了,但是比较两个Integer的大小是不能用==的,Integer是对象类型,特殊情况是当数值在-128到127之间时是可以进行比较的,原因是java为了提升性能和节省内存,好像是JDK在1.5版本中把-128到127之间的数字做了缓存,在这范围内的数值如果使用Integer.valueOf()方法的话自动装箱都是从缓存中获取的,返回的是同一个数字,但是如果是调用new Integer()的话是不会从缓存中取的,还有就是如果超过边界的话同样也是不等的。


    @Test
    public void testInteger() {
        Integer a127 = 127;
        Integer b127 = 127;
        Integer a128 = 128;
        Integer b128 = 128;

        System.out.println("a127 == b127 -> " + (a127 == b127));  //结果返回 true
        System.out.println("a128 == b128 -> " + (a128 == b128));  //结果返回 false
    }


        与Integet联系最近的是int,int作为java的原始数据类型之一,其封装类正是Integer,需要补充一点的是当int和Integer比较时,是不会出问题的,因为Integer会自动拆箱为int,相当于int和int作比较。

#####2、两个、多个double类型求和问题

        当使用double类型进行运算时会发生精度丢失的问题,这也是一个基础常见却容易被忽视的问题。先看例子


    @Test
    public void  testDouble(){
        double a = 1.13;
        double b = 1.14;

        System.out.println(a+b);  //结果是2.2699999999999996
        System.out.println(a+a);  //结果是2.26
        System.out.println(b+b);  //结果是2.28
    }   

        原因是因为double数值在求和或做减法的时候,需要将数值转换为二进制的数值,在转换过程中,存储小数部分的位数会有不够的现象,也就是无限循环小数,这就会造成微差。解决方法其实也很简单使用BigDecimal对象:


    public BigDecimal add(double d1, double d2) {
        BigDecimal bd1=new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.add(bd2);
    }   

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!