java基本类型包装类之间的值比较问题

   废话不多说,先看代码

Integer a = 2;
Integer b = 2;
if(a==b){
System.out.println("相等");
}else{
System.out.println("不相等");
}

  有人估计会说,卧槽,这边简单的代码也好意思往这放,答案显而易见啊,是的,答案当然是相等了,那么再往下看下段代码

 Integer a = 200;
 Integer b = 200;
 if(a==b){
     System.out.println("相等");
 }else{
     System.out.println("不相等");
 }
             

再运行一下看看,是不是结果出乎意料啊?怎么就不相等了呢???

对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是个大坑,整型包装类的值一定要使用 equals 方法进行判断。
 
再来看一段代码
        float a = 1.0f-0.9f;
        float b = 0.9f-0.8f;

        if(a==b){
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }

        Float x = Float.valueOf(a);
        Float y = Float.valueOf(b);
        if(x.equals(y)){
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }

卧槽~怎么都不相等呢?

因为浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,所以对于浮点数的对比不能简单的用== 或 equels方式对比
推荐方式:
1、指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的
        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");
        }

2、使用 BigDecimal 来定义值,再进行浮点数的运算操作。

        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");
        }