zoukankan      html  css  js  c++  java
  • 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");
            }
    

      

      

     
  • 相关阅读:
    zookeeper 入门知识
    MySQL: InnoDB的并发控制,锁,事务模型
    分布式理论: CAP、BASE (转)
    Nginx 入门了解
    基于RSA的前后端登陆密码加密JAVA实现(转)
    分库分表?如何做到永不迁移数据和避免热点? (转)
    node.js(一)
    c# 事件
    C#委托
    SQL Server控制执行计划
  • 原文地址:https://www.cnblogs.com/angryprogrammer/p/11934415.html
Copyright © 2011-2022 走看看