Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断

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

作者头像
阮键
发布于 2021-01-20 22:01:00
发布于 2021-01-20 22:01:00
3.5K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

反例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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) 指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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来定义值,再进行浮点数的运算操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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");

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为什么阿里开发手册建议使用 BigDecimal 来进行浮点数的运算?
大家好,我是 Guide。《阿里巴巴 Java 开发手册》中提到:“为了避免精度丢失,可以使用 BigDecimal来进行浮点数的运算”。
Guide哥
2021/12/15
1.2K0
为什么阿里开发手册建议使用 BigDecimal 来进行浮点数的运算?
BigDecimal你了解吗,遇到过哪些坑?
BigDecimal 想必我们都不陌生,涉及到金额的地方基本上都是用这个数据类型进行处理,那一般你用的是哪个数据类型?精度是如何处理的?有没有碰到过坑?
小熊学Java
2024/08/05
1120
BigDecimal你了解吗,遇到过哪些坑?
BigDecimal
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
黑洞代码
2021/01/14
8270
数据类型(3)
在 Java 程序中,我们可能会用到一些数值特别巨大、或者小数特别精确的数值,这些数值无法用基础类型表示。因此我们定义了 BigInteger/BigDecimal 类来保存这类数据,实际是以字符串形式在堆区存储。
Qwe7
2022/08/03
2600
大部分Java程序员都会忽略的几个问题,你中招没?
Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
乔戈里
2019/08/13
4940
大部分Java程序员都会忽略的几个问题,你中招没?
Java基础-基本数据类型之间的转换
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/11/12
5200
阿里Java编程规约【四】OOP规约
1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用 类名来访问即可。
acc8226
2022/05/17
5890
花了几个小时总结了一些容易出错的 Java 知识点
Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
Java_老男孩
2019/12/19
5600
JavaNote[002] - 基本数据类型
char类型用来表示在Unicode编码表中的字符,它占2个字节,可允许有65535个字符,通常用从 '\u0000' 到 '\uFFFF'之间的十六进制值来表示(前缀为u表示Unicode)。
Sam Gor
2020/05/28
4430
Java中的数据类型
Java是强类型语言 什么是强类型语言? 就是一个变量只能对应一种类型。而不是模棱两可的类型符号。 下面我通过一个例子来解释一下这个现象. javascript中可以用var表示许多数据类型 //
conanma
2021/12/06
7970
b代码构成6-数据类型
用户7865723
2023/10/18
2890
Java 代码界 3% 的王者?看我是如何解错这 5 道题的
前些日子,阿里妹(妹子出题也这么难)发表了一篇文章《悬赏征集!5 道题征集代码界前 3% 的超级王者》——看到这个标题,我内心非常非常激动,因为终于可以证明自己技术很牛逼了。
沉默王二
2019/07/17
3610
Java 代码界 3% 的王者?看我是如何解错这 5 道题的
但遗憾的是,凭借 8 年的 Java 开发经验,我发现这五道题自己全解错了!惨痛的教训再次证明,我是那被秒杀的 97% 的工程师之一。
JAVA葵花宝典
2019/07/22
3460
JAVA浮点数看这一篇就够了
涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:
traffic
2020/04/17
4K1
JAVA浮点数看这一篇就够了
征集代码界前 3% 的超级王者,解5 道题,结果我被秒杀了
前些日子,阿里妹(妹子出题也这么难)发表了一篇文章《悬赏征集!5 道题征集代码界前 3% 的超级王者》——看到这个标题,我内心非常非常激动,因为终于可以证明自己技术很牛逼了。
Java架构技术
2019/07/10
5190
征集代码界前 3% 的超级王者,解5 道题,结果我被秒杀了
浮点数比较的精度问题
如果变量 a , b 换 0.75 , 0.5 可以看出运行出 c == 1.25 ,说明浮点数运算是不稳定的。
C语言与CPP编程
2020/12/02
1.7K0
浮点数比较的精度问题
为什么新出的《阿里Java开发手册》都要读一读?
每次阿里新出Java开发手册,都会抽时间读一读。不仅如此,还会将最新的Idea插件更新一番,以规范开发。这个习惯养成很久了,以至于将Idea更新到最新版本时,发现阿里对应的插件还不能用,竟然有些懊恼升级了。
程序新视界
2020/05/18
6860
double浮点数运算为啥会丢失精度?
前言:在工作中,谈到有小数点的加减乘除都会想到用BigDecimal来解决,但是有很多人对于double或者float为啥会丢失精度一脸茫然。还有BigDecimal是怎么解决的?话不多说,我们开始。
王念博客
2019/07/24
4.6K0
java基础知识讲解(一)数据类型和运算符
Java是一种强类型语言,每个变量都必须声明其数据类型。Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。 Java中定义了**3类8种基本数据类型** 数值型- byte、 short、int、 long、float、 double 字符型- char 布尔型-boolean 整型用于表示没有小数部分的数值,它允许是负数。整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。与此相反,C和C++程序需要针对不同的处理器选择最有效的整型。 Java 语言整型常量的四种表示形式 十进制整数,如:99, -500, 0 八进制整数,要求以 0 开头,如:015 十六进制数,要求 0x 或 0X 开头,如:0x15 二进制数,要求0b或0B开头,如:0b01110011
徐建国
2021/08/03
7560
java基础知识讲解(一)数据类型和运算符
浮点数的坑很深,但不多
大家好,我是扔物线朱凯。刚才那个 0.1 + 0.2 不等于 0.3 的情况是真实存在的,不信你可以亲自试一下。我用的是 Kotlin,你换成 Java、JavaScript、Python、Swift 也都是这样的结果。要解决它也简单,在数值的右边加个 f,把它从双精度改成单精度的就可以了:
扔物线
2024/01/01
3470
浮点数的坑很深,但不多
相关推荐
为什么阿里开发手册建议使用 BigDecimal 来进行浮点数的运算?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验