专栏首页JAVA人生/面试技巧浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断

浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断

浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。

说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。

二进制无法精确表示大部分的十进制小数,具体原理参考《码出高效》。

反例:

float a =1.0f-0.9f;

float b =0.9f-0.8f;

if(a == b){

// 预期进入此代码快,执行其它业务逻辑

// 但事实上a==b的结果为false

}

Float x = Float.valueOf(a);

Float y = Float.valueOf(b);

if(x.equals(y)){

// 预期进入此代码快,执行其它业务逻辑

// 但事实上equals的结果为false

}

正例:

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

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浮点数的基本数据类型不能用 == 比较

    比较两个浮点数,一个从零开始加 11 次 0.1,另一个用 0.1 乘以 11 计算。然后用 == 比较大小。

    MickyInvQ
  • 大部分Java程序员都会忽略的几个问题

    Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

    Java技术江湖
  • 大部分Java程序员都会忽略的几个问题,你中招没?

    Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

    乔戈里
  • 为什么新出的《阿里Java开发手册》都要读一读?

    每次阿里新出Java开发手册,都会抽时间读一读。不仅如此,还会将最新的Idea插件更新一番,以规范开发。这个习惯养成很久了,以至于将Idea更新到最新版本时,发...

    程序新视界
  • Java基础数据类型之包装类equals和==详解

    八大基本数据类型均有对应的包装类 byte、short、int、long、float、double、char、boolean分别对应Byte、Short、I...

    我是李超人
  • 花了几个小时总结了一些容易出错的 Java 知识点

    Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

    Java_老男孩
  • 基本数据类型

    关于java的类型,这里讲解基本类型,引用类型较复杂,分开来讲,那么开始把,基本类型有8种:

    晚上没宵夜
  • Kotlin入门(17)等式判断的情况

    话说等式可是编程语言最基本的表达式之一,不管哪种高级语言,无一例外都采用双等号“==”判断两个变量是否相等;就算是复杂的对象,在Java中也可通过equals函...

    用户4464237
  • BigDecimal

    《阿里巴巴Java开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。

    Vincent-yuan
  • 深入理解 Java 基本数据类型

    一般情况下,定义了某数据类型的变量,就不能再随意转换。但是 JAVA 允许用户对基本类型做有限度的类型转换。

    静默虚空
  • java采坑之路

    为什么n3== n4 是false呢?由于包装类的缓存机制。包装类的比较用equals去判断。最推荐的还是用工具类去判断。例如上面的列子如果n3=null的话n...

    java金融
  • Java 中的 ==, equals 与 hashCode 的区别与联系

    这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。   而通过 new 来产生一个对象,并将这个对象和str1进行绑定:

    heasy3
  • BigDecimal

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,...

    黑洞代码
  • Java常量池详解,秒懂各种对象相等操作

    (2)节省运行时间:比较字符串时,== 比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。

    Java识堂
  • 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了。

    所以涉及金钱的计算一定不要使用float和double。使用BigDecimal并且一定要用String来构造。 上面的列子我们可以这样来初始化 new Big...

    java金融
  • Java 基础面试题总结

    hey guys ,这不是也到了面试季了么,cxuan 又打算重新写一下 Java 相关的面试题,先从基础的开始吧,这些面试题属于基础系列,不包含多线程相关面试...

    cxuan
  • 一次性搞清楚equals和hashCode

    在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范。

    java架构师
  • BigDecimal和BigInteger

    我们知道计算机都是以二进制的形式存储数据的,而我们日常则是使用十进制,那么我们的 数字 存进计算机则需一个进制转换的过程,这过程就会损失精度的,就导致浮点数不能...

    晚上没宵夜
  • 一篇文章讲清楚Java基本数据类型,常量池,以及自动拆装箱的秘密

    Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

    Java技术江湖

扫码关注云+社区

领取腾讯云代金券